0

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

代码

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?

感谢您的提示!

4

1 回答 1

0

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

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

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

于 2015-11-07T02:07:15.407 回答