Promise 相关问题
Promise中状态改变的问题
- Promise中状态一旦改变之后,就已经锁定,不会再发生变化
MDN中对此的解释为
使用已解决(resolved)这个术语来描述 Promise——这意味着该 Promise 已经敲定(settled),或为了匹配另一个 Promise 的最终状态而被“锁定(lock-in)”,进一步解决或拒绝它都没有影响。原始 Promise 提案中的 States and fates 文档包含了更多关于 Promise 术语的细节。在口语中,“已解决”的 Promise 通常等价于“已兑现”的 Promise,但是正如“States and fates”所示,已解决的 Promise 也可以是待定或拒绝的。
- 我自己的理解是相当于在第一次状态改变之后,和return操作不太一样,后续代码仍然会执行,但是这个Promise的状态不会再发生变化,以第一次为准,之后以这次状态执行后续处理步骤
// 0
// 0
// 0
// 3
// 4
// 成功
function test(){
return new Promise((resolve,reject)=>{
[0,0,0].forEach((item)=>{
console.log(item)
resolve()
})
console.log(3)
reject()
console.log(4)
})
}
// 5
// 失败
// 进settimeout
function test2(){
return new Promise((resolve,reject)=>{
setTimeout(function() {
console.log("进settimeout")
resolve()
}, 10);
reject()
console.log(5)
})
}
// 4
// 失败
// 0
// 0
// 0
// 3
function test3(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
[0,0,0].forEach((item)=>{
console.log(item)
resolve()
})
console.log(3)
},0)
reject()
console.log(4)
})
}
function testFunction(){
test3().then(()=>{
console.log("成功")
}).catch(()=>{
console.log('失败')
})
}
testFunction()