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()呼び出される外部の promise を作成します。
  2. 次に、最初は拒否された内部の約束を作成します。
  3. 次に、最初のハンドラー (reject ハンドラーなど) の 2 番目のハンドラーに進み、.then()"Step 1.1" の出力が表示されます。
  4. その 1.1 ハンドラーは外側の promise を拒否しますが、処理は内側の promise で続行されます。
  5. 内部の promise を拒否するための.then()ハンドラーがあり、そのハンドラーから拒否された promise をスローまたは返さなかったため、内部の promise の状態は解決済みに切り替わります。拒否されたプロミスを「処理」し、拒否されたプロミスをスローまたは返さない場合、状態はフルフィルメントに切り替わります。
  6. したがって、.then()呼び出される次のハンドラーは「ステップ 2」です。これは、promise が拒否されずに実行されたためです。
  7. その解決ハンドラーは次に を呼び出しますresolve("done")が、外部の約束はすでに拒否されており、resolve()それを試みても何もしません。その状態はすでに設定されており、変更できません。
  8. 内部の promise が満たされているため、"Step 3".catch()ハンドラーをスキップします。
  9. 外側の promise は以前に拒否されたため、"Step 9" の.then()満たされたハンドラーをスキップし、最後の.catch()ハンドラー "Step 9 - in main catch" に進みます。

すべての promise は非同期で解決または拒否されることに注意してください。外側の promiseを呼び出しても、外側の promise のハンドラーreject()はすぐには実行されません。.catch()将来実行するようにスケジュールします。

于 2015-11-07T02:07:15.407 に答える