ES6之Promise

ES6之Promise

是ES6引入的异步编程的新解决方案,非常重要。

单个异步任务可能看不出来优势,但当多个时,链式调用是很好用的

  • 语法上Promise是一个构造函数,所以我们需要结合new关键字来使用,它需要传一个函数作为参数,函数的形参是resolve和reject
<script>
    new Promise((resolve, reject) => {
        setTimeout(()=>{
            resolve(111)
        },3000)
    }).then(value => {
        console.log(value);
    }, reason => {
        console.log(reason)
    })
</script>
  • Promise.prototype.then()

    then方法是Promise原型上的方法,所以new Promise()后能直接调用then()方法,因为实例肯定能调用原型上的方法。

    只有在调用了resolve方法之后,才会触发then后面的第一个方法

    只有在调用了reject方法之后,才会触发then后面的第二个方法

    调用了这两个方法,相当于改变了Promise的一个状态

    那为什么能一直调用then()呢?是因为then()的返回结果是Promise类型的对象,我们才可以一直调用then方法,即链式调用。其实then()返回的那个Promise对象里面,有记录它此刻的一个状态。

    状态(PromiseStatus)取决于then(() => {})这个回调里面的return值

    return值有如下三种情况

    1、如果是非Promise类型的属性,那么状态是成功,比如:

    const p = new Promise((resolve, reject) => {
        resolve()
    });
    const result = p.then(value => {
    					//因为这里没有返回值嘛,所以默认返回的是undefined,不属于Promise类型,所以状态是成功
    }, reason => {
    
    });
    console.log(result);  //一个Promise对象,它里面的状态是成功
    

    2、如果是Promise类型的属性,那么由Promise决定

    const p = new Promise((resolve, reject) => {
        resolve()
    });
    const result = p.then(value => {
        return new Promise((resolve, reject) => {
            reject()  //触发失败状态
        })
    }, reason => {
    
    });
    console.log(result);  //一个Promise对象,它里面的状态是失败
    

    3、如果在then()里面是抛出错误的话,那么状态也是失败

💛 现在应该能明白当多个then()连用时,该执行它里面的哪个回调了吧?由状态决定

posted @ 2022-06-08 21:18  朱在春  阅读(30)  评论(0编辑  收藏  举报