我对Promise中的resolve
感到困惑。
resolve
之前调用 innerResolve
,但是为什么'内部Promise然后执行'在chrome控制台中的'Promise then execute'之前被记录。
我认为可能是这样:
当promise的状态为PENDING时,调用resolve
只需将状态设置为FULFILLED,并且当调用then
方法时,作业将排入jobQueue。innerPromise.then
被调用首先,所以工作排在第一位。
这个问题是否有规范性解释?
这是我的代码:
console.log("main start")
new Promise(resolve =>{
new Promise(innerResolve =>{
resolve()
console.log("resove is called")
innerResolve()
console.log("innerResolve is called")
}).then(() => {
console.log('inner Promise then execute')
})
}).then(() => {
console.log('Promise then execute');
})
console.log("main end")
答案 0 :(得分:1)
resolve()
不会调用then
方法。 resolve()
的调用是在下一个tick之后调用then
方法的队列,因此整个内部promise promise解析器将在内部then
方法之前立即执行,然后是外部then
方法将在下一个tick中以该顺序调用,因为在将外部promise连接之前,内部promise在内部promise中同步链接。
我添加了两个日志来帮助澄清为什么then
方法的顺序与您预期的不同:
console.log("main start")
new Promise(resolve =>{
console.log("outer resolver execute")
new Promise(innerResolve =>{
resolve()
console.log("resove is called")
innerResolve()
console.log("innerResolve is called")
}).then(() => {
console.log("inner Promise then execute")
})
console.log("inner promise chained")
}).then(() => {
console.log("Promise then execute");
})
console.log("main end")
答案 1 :(得分:0)
resolve()
console.log("resove is called")
innerResolve()
console.log("innerResolve is called")
一旦完成,事件循环将检查是否已解决承诺并执行所有已完成的承诺,因为两者都已完成。它可能会根据编译器调用它们中的任何一个。尝试以下示例
console.log("main start")
new Promise(resolve =>{
new Promise(innerResolve =>{
resolve()
console.log("resove is called")
setTimeout(innerResolve, 1000);
console.log("innerResolve is called")
}).then(() => {
console.log('inner Promise then execute')
})
}).then(() => {
console.log('Promise then execute');
})
console.log("main end")

因为innerResolve后来被执行,所以稍后调用then()