【问题标题】:when - Unexpected Promise chain with intermediate errorswhen - 带有中间错误的意外 Promise 链
【发布时间】:2015-11-07 10:19:25
【问题描述】:

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

代码

var when = require('when'); // I'm using when@3.7.4 node_modules/when

console.log("INIT");

when.promise(function(resolve, reject) {
  return when.reject("false")
  .then(function(ok) {
      console.log("Step 1 - in then, ok = %s", ok);
      return 'ok1';
  }, function(err) {
      console.log("Step 1.1 - in catch, err = %s", err);
      return reject(err);
  }).then(function(ok) {
      console.log("Step 2 - in then, ok2 = %s", ok);
      return resolve("done");
  }).catch(function(err) {
      console.log("Step 3 - in catch, err = %s", err);
      return reject(err);
  });
}).then(function(mainok) {
    console.log("Step 9 - in main then, mainok = %s", mainok);
}).catch(function(err) {
    console.log("Step 9 - in main catch, err = %s", err);
});

这是我运行时收到的输出

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

阅读 API 时,我期望会调用第 1.1 步,然后调用第 9 步而不是第 2 步。

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

感谢您的提示!

【问题讨论】:

标签: promise es6-promise when-js


【解决方案1】:

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

  1. 您创建了一个外部 Promise,等待对其调用 resolve()reject()
  2. 然后您创建一个开始被拒绝的内部承诺。
  3. 然后它转到第一个 .then() 处理程序的第二个处理程序(例如拒绝处理程序),您会看到“步骤 1.1”输出。
  4. 该 1.1 处理程序随后拒绝外部承诺,但内部承诺继续处理。
  5. 因为您有一个用于拒绝内部承诺的.then() 处理程序,并且您没有从该处理程序抛出或返回被拒绝的承诺,所以内部承诺的状态切换为已解决。如果你“处理”了一个被拒绝的承诺并且不抛出或返回一个被拒绝的承诺,那么状态就会切换到已完成。
  6. 因此,下一个被调用的 .then() 处理程序是“步骤 2”,因为现在已履行承诺,而不是拒绝。
  7. 然后解析处理程序调用resolve("done"),但外部承诺已经被拒绝尝试resolve(),它现在什么都不做。其状态已设置,无法更改。
  8. 由于现在实现了内部承诺,它跳过了“步骤 3”.catch() 处理程序。
  9. 外部 Promise 早些时候被拒绝,因此它跳过了“第 9 步”.then() 已完成的处理程序,并转到最后一个 .catch() 处理程序“第 9 步 - 在主要捕获中”。

请记住,所有承诺都是异步解决或拒绝的。在外部 promise 上调用 reject() 不会立即为外部 promise 运行 .catch() 处理程序。它安排它在未来运行。

【讨论】:

  • 非常有用,谢谢。那么以我的方式使用内部 Promise 是否合法,或者我宁愿使用 Promise 组合器,例如 .all 或 .join (或类似的)?
  • @Boris:您绝对应该使用组合子,并且几乎从不使用 when.promise 构造函数
  • @Bergi 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多