前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript期约Promise

JavaScript期约Promise

作者头像
大熊G
发布2022-11-14 16:47:53
3420
发布2022-11-14 16:47:53
举报

theme: channing-cyan

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

理解期约

Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。简单来说我们可以用它来处理异步操作。

期约有三种状态,待定(pending)解决(resolve)拒绝(rejected)。通俗来说就是我们谈事情,事情没有签订合同前叫待定,签订合同后叫兑现,还有就是双方可能有各种原因没签上合同,这个就叫做拒绝。

我们应该明确一点就是resolve和rejected是相悖的,它的状态只能改变一次,在确定执行后也不能通过调用相悖的方法来改变。

代码语言:javascript
复制
     let p = new Promise((resolve, reject) => {
        setTimeout(reject, 10000);//10秒后调用reject()
    })
    setTimeout(console.log,0,p);//Promise {<pending>}
    setTimeout(console.log,11000,p)//Promise {<rejected>: undefined}

如果执行器中的代码在超时前解决或者拒绝,那么超时回调再尝试拒绝也只能失败。

期约的实例方法

  • Promise.prototype.then() 在ES6异步结构中,任何对象都有一个then()方法,它接收俩个参数 onResolved和onRejected,这俩个参数是可选的,如果我们传入的话它会在期约分别进入不同状态时执行。
代码语言:javascript
复制
 function onResolved(id) {
        setTimeout(console.log,0,id,'resolved')
    }
    function onRejected(id) {
        setTimeout(console.log,0,id,'rejected')
    }
    let p1 = new Promise((resolved, rejected) => setTimeout(resolve, 2000));
    let p2 = new Promise((resolved, rejected) => setTimeout(resolve,2000));
    p1.then(()=>onResolved('p1'),()=> onRejected('p1'));
    p2.then(()=> onRejected('p2'),()=>onResolved('p2'));
image.png
image.png

再次强调一下期约的只能转换为最终状态一次,我们运行了俩次,但它只执行第一次。

传给then的任何非函数类型的参数都会被忽略,如果只想提供onRejected参数,那么只需要将对应的参数传入undefined就好了。

  • Promise.prototype.catch() catch()方法用于给期约添加拒绝处理程序,这个方法只接收一个参数onRejected。它相当于一个语法糖,调用的相当于是Promise.prototype.then(null,onRejected)。
代码语言:javascript
复制
     let p = Promise.reject();
    let onRejected = function(e) {
        setTimeout(console.log,0,'jackson');
    }
    p.then(null,onRejected);//jackson
    p.catch(onRejected);//jackson
  • Promise.prototype.finally() finally()这个实力不同于then和catch方式返回的实例,它被设定为一个与状态无关的方法,运行它后都会原样返回父期约,无论父期约是解决还是拒绝,都会原样后传。
代码语言:javascript
复制
    let p1 = Promise.resolve('jackson');
    let p2 = p1.finally(); //Promise <resolved> jackson
    let p3 = p1.finally(()=>'bear')//Promise <resolved> jackson

如果返回的是一个待定期约或者处理程序错误,则会返回相应的期约(待定或拒绝)。

期约连锁与期约合成

  • 期约连锁就是将一个期约一个期约拼接起来。直接看代码,代码比较直观。
代码语言:javascript
复制
 // 期约连锁
    let p  = new Promise((resolve, reject)=>{
        console.log('jackson');
        resolve();
    })
    p.then(()=> console.log('bear'))
    .then(()=>console.log('jackson11'))
    .then(()=>console.log('jackson22'));
image.png
image.png
  • 期约合成很像函数合成,还是看代码吧。
代码语言:javascript
复制
 // 期约合成
    function add2(x) {
        return x + 2;
    }
    function add3(x) {
        return x + 3;
    }
    function add4(x) {
        return x + 4;
    }
    function add10(x){
        return Promise.resolve(x)
        .then(add2)
        .then(add3)
        .then(add4);
    }
    add10(10).then(console.log)
image.png
image.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: channing-cyan
    • 理解期约
      • 期约的实例方法
        • 期约连锁与期约合成
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档