web-dev-qa-db-ja.com

Bluebird、promises、then()

私は数日だけブルーバードを使用してきましたが、古いコードとpromisify itをすべて調べたいです:)

私の問題は、then()コマンドのフローをまだ完全に把握していないことです。

次の2つのブロックを検討してください。

A

methodThatReturnsAPromise().then(task2).then(task3);

B

var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
  1. シナリオAでは、task3task2の結果を取得しますか? Bでは、全員が最初の約束の結果を取得しますか?

  2. 2つ目はPromise.allをbluebirdから実行することとどう違いますか?

  3. catchメソッドの使用に関して、これらのA/B/Promise.allはどのように異なりますか(どこに配置しますか)。

申し訳ありませんが、1つの質問の束です。

40
Madd0g

素晴らしい約束の世界へようこそ。

thenの例での動作

1のアサーションは正しいです。値に対してPromise.resolveを使用して、Bluebirdで解決するプロミスをシミュレートできます。

これを見せましょう:

Promiseを返す関数を取得しましょう:

function foo(){
    return Promise.resolve("Value");    
}

foo().then(alert);

この短いスニペットは"Value"として警告します

それでは、異なる値を警告して返す2つのプロミスを作成してみましょう。

function task2(e){
    alert("In two got " + e);
    return " Two ";
}
function task3(e){
    alert("In three got " + e);
    return " Three ";
}

したがって、 最初のコード でわかるように、それぞれ前の部分の値を持つチェーンで実際に解決されます。

2番目の例では、task2とtask3の両方が同じ値を取得し、一緒に実行されます(つまり、タスク3はタスク2を待機しません)。これは、 here で確認できます。

Promise.all

Promise.all(または単にthenフルフィルメントハンドラから配列を返し、.spreadを使用)は、複数の結果がすべて完了するのを待つために使用されます。あなたの例では、複数の部分の単一の結果をフックしています。

キャッチ

エラーをキャッチする場所に常にcatchを配置します。通常の同期コードのように。常に約束または約束されたコードを常にスローすることを忘れないでください。

48

シナリオAでは、task3はtask2の結果を取得しますか? Bでは、全員が最初の約束の結果を取得しますか?

はい。

2番目のものは、Promise.allをbluebirdから実行することとどのように違いますか?

(並列)タスク2と3の結果を新しいプロミスにフェッチしません。

Catchメソッドの使用に関して、これらのA/B/Promise.allはどのように異なりますか(どこに配置しますか)。

通常、特定のエラーをキャッチする場合を除き、チェーンの最後に配置します。

promise.catch()
// handles rejections of this promise

promise.then(task2).catch()
// handles rejections from either promise or task2
// if promise is rejected, task2 will not be executed

Promise.all(promise.then(task2), promise.then(task3)).catch()
// handles rejections from any.
// if promise is rejected, neither task2 nor task3 will be executed
// if task2 or task3 throw, the error will immediately handled
// and the other task will not be affected (but its result is unavailable)
12
Bergi

あなたは1つの単純な原則を得ていません連鎖

最初のように書くことができます

var promise   = methodThatReturnsAPromise(),
    promise1  = promise.then(task2);
promise1.then(task3);

第二の場合

var promise   = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);

これが2つの違いを説明することを願っています

3
aWebDeveloper