当前位置:   article > 正文

promise 与 fetch 详细介绍 与 使用_promise fetch

promise fetch

1. promise

1.1  含义

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大;

1.2  基本语法

  1. new Promise(function(resolve, reject) {
  2. // ... some code 比如发送ajax
  3. if (/* 异步操作成功 */){
  4. resolve(value);
  5. } else {
  6. reject(error);
  7. }
  8. }).then(data => {})
  9. .catch( err => {});

1.3 状态

三个方法调用,对应三个状态修改;pending--> notify(); fulfilled--> resolve() ; unfulfilled  ->reject();三个方法返回的ren

1.4 方法介绍:

Promise:  构造方法,里面传递一个函数,这个函数体内一般异步操作,成功调用resolve 方法,反之调用reject 方

then: 指定resolved状态和rejected状态的回调函数。参数说明,第一个是状态为成功的回调函数,第二个是失败的回调

如果当前Promise对象状态为成功,那么在 new promise((resolve, reject) =>{resolve()}).then(data=>{}) ;then的第一个回调将被调用;

catch:在异步操作抛出异常时触发,如果promise状态为 unfulfilled  也将会被触发;

all :异步操作并行执行,当同时执行完毕后,才会执行

race: 当多个异步操作一同执行,当有一个执行完毕,那么方法将被执行

1.5  一般使用

  1. const getJson = () =>{
  2. return new Promise((resolve, reject) => {
  3. setTimeout(()=>{
  4. let a = Math.random()*10;
  5. if(a<5){
  6. resolve(a);
  7. }else{
  8. reject(a);
  9. }
  10. },1000);
  11. });
  12. }
  13. let returnData = getJson().then(data => {
  14. console.log("我是成功回调!"+data);
  15. }).catch( err => {
  16. console.log("我是失败回调!"+err);
  17. })

2. fetch 

2.1 介绍

fetch是用来取代传统的XMLHttpRequest

2.2 基本语法

  1. fetch('user/v1/getInfo',{
  2. method:'get',
  3. headers: {
  4. 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
  5. 'X-Requested-With': 'XMLHttpRequest',
  6. },
  7. body: new FormData(document.getElementById('comment-form'))
  8. //或者
  9. //body: JSON.stringify({
  10. // email: 'huang@163.com'
  11. // name: 'jim'
  12. //})
  13. }).then(response =>{
  14. const type = 'json';
  15. //response 这个对象并不与 servlet中的一样
  16. if(type==='json'){
  17. return response.text(); //返回一个text的resolve的promise对象
  18. }else{
  19. return response.json(); //返回一个json的resolve的promise对象
  20. }
  21. }).then(data => {
  22. console.log("返回的数据!");
  23. //可以设置返回一个 promise对象 的状态
  24. }).catch(err => {
  25. console.log("请求异常!");
  26. })

2.3 方法对象介绍

Response 代表响应, fetch 的 then 方法接收一个 Response 实例, 当然你也可以手动创建 Response 对象 —— 比如在 service workers 中可能会用到. Response 可以配置的参数包括:

  • type - 类型,支持: basiccors
  • url - 响应的 URL
  • useFinalURL - Boolean 值, 说明这是否是响应的最终 URL
  • status - 状态码 (例如: 200404, 等等)
  • ok - Boolean值,代表响应是否成功(status 值在 200-299 之间)
  • statusText - 与状态码相对应的状态值(例如: OK为200)
  • headers - 与响应相关联的 Headers 对象.
  • redirected - 指示响应是否是重定向的结果。也就是说,它的 URL 列表有多条目录。

Response 提供的方法如下:

  • clone() - 创建一个 Response 对象的克隆.
  • error() - 返回一个与网络错误相关的新 Response 对象.
  • redirect() - 重定向,使用新的 URL 创建新的 response 对象..
  • arrayBuffer() - 返回一个 resolve 是 ArrayBuffer 的 promise 对象。
  • blob() - 返回一个 resolve 是 Blob 的 promise 对象。
  • formData() - 返回一个 resolve 是 FormData  的 promise 对象。
  • json() - 返回一个 resolve 是 JSON 的 promise 对象。
  • text() - 返回一个 resolve 是文本的 promise 对象。

Request 对象表示一次 fetch 调用的请求信息。传入 Request 参数来调用 fetch, 可以执行很多自定义请求的高级用法:

  • method - 支持 GETPOSTPUTDELETEHEAD
  • url - 请求的 URL
  • headers - 对应的 Headers 对象
  • referrer - 请求的引用者(例如:client)
  • mode - 是否允许跨域请求,以及哪些响应的属性是可读的。可选值:
  • cors:(默认),允许跨域请求,将遵守 CORS 协议。
  • no-cors:该模式允许来自 CDN 的脚本、其他域的图片和其他一些跨域资源。前提条件是请求的 method 只能是 HEAD、GET 或 POST。此外,如果 ServiceWorkers 拦截了这些请求,它不能随意添加或者修改除这些之外 Header 属性。第三,js 不能访问 Response 对象中的任何属性,这确保了跨域时 ServiceWorkers 的安全和隐私信息泄露问题。
  • same-origin:如果是一个跨域请求,将返回一个 error。
  • navigate:支持导航的模式,仅用于 HTML 导航。
  • credentials - 设置 cookies 是否随请求一起发送。可选值: 
  • omit:(默认),不发送 Cookie。
  • same-origin:同域下自动发送 Cookie。
  • include:始终发送 Cookie,即使是跨域。
  • redirect - 定义重定向处理方式。可选值:follow(默认), error, manual。
  • integrity - 子资源完整性值。
  • cache - 设置缓存模式。可选值: 
  • default:浏览器在其 HTTP 缓存中查找匹配的请求。
  •       a. 如果匹配并且是新鲜的,它将从缓存中返回。
  •       b. 如果存在匹配但已失效,则浏览器将向远程服务器发出有条件的请求。如果服务器指出资源没有改变,它将从缓存中返回。否则资源将从服务器下载并且缓存将被更新。
  •       c. 如果没有匹配,浏览器将发出正常的请求,并且下载的资源更新缓存。
  • no-store:浏览器从远程服务器获取资源,而不先查看缓存,并且不会使用下载的资源更新缓存。
  • reload:浏览器从远程服务器获取资源,而不先查看缓存,但随后将使用下载的资源更新缓存。
  • no-cache:浏览器在其 HTTP 缓存中查找匹配的请求。
  •       a. 如果匹配,新鲜或陈旧,浏览器将向远程服务器发出有条件的请求。如果服务器指出资源没有改变,它将从缓存中返回。否则资源将从服务器下载并且缓存将被更新。
  •       b. 如果没有匹配,浏览器将发出正常的请求,并用下载的资源更新缓存。
  • force-cache:浏览器在其 HTTP 缓存中查找匹配的请求。
  •       a. 如果有匹配,新鲜或陈旧,它将从缓存中返回。
  •       b. 如果没有匹配,浏览器将发出正常的请求,并用下载的资源更新缓存。
  • only-if-cached:浏览器在其 HTTP 缓存中查找匹配的请求。只能用在 mode 为 same-origin 的情况下
  •       a. 如果匹配,新鲜或陈旧,将从缓存中返回。
  •       b. 如果没有匹配,浏览器将返回一个错误。

3. promise 与 fetch 联合使用

  1. const ajax_ = (url,args,type='json') => {
  2. return new Promise((resolve, reject) => {
  3. fetch(url,args).then(function (response) {
  4. let data = '';
  5. if (type === 'json')
  6. data = response.json();
  7. else
  8. data = response.text();
  9. return data;
  10. }).then(data => {
  11. if (type === 'json' && data.code==404 ) {
  12. console && console.error('请求异常:'+data.msg);
  13. reject('请求异常:'+data.msg);
  14. }else {
  15. resolve(data);
  16. }
  17. }).catch(function (ex) {
  18. console && console.error('请求异常:'+ex);
  19. reject('请求异常:'+ex);
  20. });
  21. });
  22. }
  23. ajax_ ('user/v1/getInfoById',{method:'get',headers:{...},body:{username,password}});

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/148473
推荐阅读
相关标签
  

闽ICP备14008679号