when - 具有中间错误的意外Promise链

时间:2015-11-06 23:25:59

标签: promise es6-promise when-js

我想知道以下是否是正常行为?

代码

INIT
Step 1.1 - in catch, err = false
Step 2 - in then, ok2 = undefined
Step 9 - in main catch, err = false

这是我在运行时收到的输出

{{1}}

阅读API我希望调用步骤1.1,然后执行步骤9,而不是步骤2.

这是一个错误还是我误读了API?

感谢您的提示!

1 个答案:

答案 0 :(得分:0)

是的,这是预期的行为。以下是我看到的步骤:

  1. 您创建的外部承诺正在等待resolve()reject()被调用。
  2. 然后你创建一个开始被拒绝的内部承诺。
  3. 然后转到第一个.then()处理程序的第二个处理程序(例如拒绝处理程序),然后看到“Step 1.1”输出。
  4. 然后1.1处理程序拒绝外部承诺,但继续处理内部承诺。
  5. 因为您有拒绝内部承诺的.then()处理程序,并且您没有从该处理程序抛出或返回被拒绝的承诺,内部承诺的状态将切换为已解决。如果您“处理”被拒绝的承诺并且不抛弃或返回被拒绝的承诺,则状态将切换为已履行。
  6. 因此,被调用的下一个.then()处理程序是“步骤2”,因为承诺现在已经完成,而不是被拒绝。
  7. 该解析处理程序然后调用resolve("done"),但外部承诺已被拒绝尝试resolve()它现在什么都不做。它的状态已经设定,无法更改。
  8. 由于现在履行了内部承诺,它会跳过“第3步”.catch()处理程序。
  9. 外部承诺早先遭到拒绝,因此它跳过“第9步”.then()已完成的处理程序,并转到最后一个.catch()处理程序“第9步 - 主要捕获”。
  10. 请记住,所有承诺都是异步解决或拒绝的。在外部promise上调用reject()不会立即运行外部promise的.catch()处理程序。它安排它在将来运行。