Promise的resolve参数

178 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

先了解一下promise的三个状态

待定( pending):初始状态,既没有被兑现,也没有被拒绝;
当执行executor中的代码时,处于该状态;

已兑现( fulfilled):意味着操作成功完成;
执行了resolve时,处于该状态;

已拒绝( rejected ):意味着操作失败;
执行了reject时,处于该状态;

普通的值或者对象

new Promise((reoslve, reject) => {
        // 1 普通的值或者对象
        // reoslve(1111)//res 1111
        //resolve({ name: "zz", age: 18 })//res { name: 'zz', age: 18 }
    }).then(res => {
        console.log("res", res);
    }, err => {
        console.log("err", err);
    })

传入一个Promise

const newPromise = new Promise((resolve, reject) => {
    //如果这里两个回调函数都不写 会执行这边的代码 但promise2的两个回调函数都不会触发
    console.log("newPromise是可以正常被执行的");
    //如果这边触发了resolve的回调函数 promise2才会触发回调函数
    resolve("ssss")
})
const promise2 = new Promise((resolve, reject) => {
  // 2 传入一个Promise
    // 那么当前的Promise的状态会由传入的Promise来决定 相当于状态进行了移交 

    console.log("Promise是可以正常被执行的");
    reject(newPromise)
    resolve(newPromise)
    console.log("Promise是可以正常被执行的");
})
promise2.then(res => {
        console.log("res", res);
    }, err => {
        console.log("err", err);
    })

其说明 resolve接收的参数为promise时 当前的Promise的状态会由传入的Promise来决定 相当于状态进行了移交 也就是回调函数的执行由传入的promise决定

传入的promise状态当前的promise状态结果
resolve("ssss")resolve(newPromise)res ssss
reject('wswd')resolve(newPromise)err2 wswd
pendingresolve(newPromise)无打印

补充说明一下

传入的promise状态当前的promise状态结果
resolve("ssss")reject(newPromise)err2 Promise { 'ssss' }
reject('wswd')reject(newPromise)报错
pendingreject(newPromise)err2 Promise { }
pendingpending无打印
resolve("ssss")pending无打印
reject('wswd')pending报错

总结

当resolve参数是promise时 当前的Promise的状态会由传入的Promise来决定

当reject参数是promise时 会处于reject状态 除非传入的promise也是reject状态时 会报错

当 当前promise是pending状态时 会无打印 除非传入的promise是reject状态时 会报错

传递一个对象 并且这个对象有实现then方法

当传递一个对象 里面有定义方法时

new Promise((resolve, reject) => {
    const obj = {
        run: function () {
            console.log('hi');
        }
    }
    resolve(obj)
}).then(res => {
    console.log("res", res);
}, err => {
    console.log("err", err);
})

结果为:res { run: [Function: run] }

当方法名为then时 就会执行then方法

new Promise((resolve, reject) => {
    const obj = {
        then: function () {
            console.log('hi');
        }
    }
    resolve(obj)
}).then(res => {
    console.log("res", res);
}, err => {
    console.log("err", err);
})

结果为:hi

当then方法有状态为resolve/reject时

new Promise((resolve, reject) => {
    const obj = {
        then: function(resolve, reject) {
            resolve("reject message")//结果为:res reject message
            // reject("reject message")//结果为:err reject message
        }
    }
    resolve(obj)
}).then(res => {
    console.log("res", res);
}, err => {
    console.log("err", err);
})

总结:

传递一个对象 并且这个对象有实现then方法时 会执行该then方法 并且有由该then方法决定后续状态

这也能解释 情况2 执行了then方法内的代码 又因为没有调用resolve或reject函数 导致状态为pending 所以没有执行.then里的代码

情况3是then方法有将pending状态改变 其决定了后续状态