网络请求--Fetch

以前都是用jQuery.ajax() 来请求资源,而fetch 是现代通用的方法,它相当于是使用Promise 的AJAX。不兼容IE 浏览器。
fetch 解决了 AJAX 致命的回调地狱(相互嵌套的回调可读性极差)。而 fetch 可以统一处理error。
它和 AJAX 的区别是

  • 当接收到一个代表错误的 HTTP 状态码时,从 fetch() 返回的 Promise 不会被标记为 reject, 即使响应的 HTTP 状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的
    ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。
  • fetch() 可以不会接受跨域 cookies;你也可以不能使用 fetch() 建立起跨域会话。其他网站的 Set-Cookie 头部字段将会被无视。
  • fetch 不会发送 cookies。除非你使用了credentials 的初始化选项。(自 2017 年 8 月 25 日以后,默认的 credentials 政策变更为 same-origin。Firefox 也在 61.0b13 版本中进行了修改)

基本语法

let promise = fetch(url, [options])
  • url 是请求路径
  • [options] 是可选参数,例如设置method、header 等

一个简单的示例:

   let promise = fetch('/Fetch/TestFetch', { method:'post' })
       .then(function (response) {
           return response.json();
       })
       .then(function (myJson) {
           console.log(myJson);
       });

下面的例子使用了await(await 只能在async 的函数里使用)
做了点小变化,传入了更多参数,headers 和 body,
判断是否成功使用 response.ok, awiat 表示等待
let json = await response.json();表示等response.json()执行完之后将值赋给 json,
如果不使用await,赋值运算就不会等待response.json()的完成直接将值赋给json 这个变量

    getFetch();
    async function getFetch() {
        let user ={
            name: 'klaus',
            age:'23'
        }
        let response = await fetch('/Fetch/TestFetch', {
            method: 'post',
            headers: {
                'Content-Type': 'application/json;charset=utf-8'
            },
            body: JSON.stringify(user) });
        if (response.ok) { // 如果 HTTP 状态码为 200-299
            let json = await response.json();
            alert(json.data);
        } else {
            alert("HTTP-Error: " + response.status);
        }
    }

基础知识:
promise MDN
async 和 await 用法
fetch–现代 JavaScript 教程
fetch MDN

你可能感兴趣的:(JavaScript)