fetch:
基于promise,Promise,generator/yield,await/async 都是现在和未来 JS 解决异步的标准做
同构方便(不同端的支持),语法简单,可以then或者async await 使用
-
原生支持率并不高,幸运的是,引入下面这些 polyfill 后可以完美支持 IE8+ :
- 由于 IE8 是 ES3,需要引入 ES5 的 polyfill: es5-shim, es5-sham
- 引入 Promise 的 polyfill: es6-promise
- 引入 fetch 探测库:fetch-detector
- 引入 fetch 的 polyfill: fetch-ie8
- 可选:如果你还使用了 jsonp,引入 fetch-jsonp
- 可选:开启 Babel 的 runtime 模式,现在就使用 async/await
Fetch 请求默认是不带 cookie 的,需要设置 fetch(url, {credentials: 'include'})
服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
IE不支持,使用的XHR模拟,但是IE8, 9 的 XHR 不支持 CORS 跨域
fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
fetch没有办法原生监测请求的进度,而XHR可以
-
fetch中可以设置mode
- “same-origin” 只有来自同域的请求才能成功,其它的均将被拒绝。
- “cors” 允许不同域的请求,但要求有正确的 CORs 头信息。
- “cors-with-forced-preflight” 在执行真正的调用前先执行preflight check。
- “no-cors” 目前这种模式是无法执行的。(不跨域)
axios
- 可以在 node.js 创建 http 请求
- 支持 Promise API
- 客户端支持防止CSRF
- 提供了一些并发请求的接口(重要,方便了很多的操作)
ajax
- ajax需要send和open,不符合promise 规范