本文已参与「新人创作礼」活动,一起开启掘金创作之路。
先了解一下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 |
| pending | resolve(newPromise) | 无打印 |
补充说明一下
| 传入的promise状态 | 当前的promise状态 | 结果 |
|---|---|---|
| resolve("ssss") | reject(newPromise) | err2 Promise { 'ssss' } |
| reject('wswd') | reject(newPromise) | 报错 |
| pending | reject(newPromise) | err2 Promise { } |
| pending | pending | 无打印 |
| 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状态改变 其决定了后续状态