在调用不同的resolve时执行有关promise的顺序

时间:2017-10-02 07:12:47

标签: javascript es6-promise

我对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")

2 个答案:

答案 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)

将调用bot解析,因为它们位于单个堆栈框架中

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()