40

bluebird を使ってまだ数日しか経っていませんが、古いコードをすべて見直してみたいと思いますpromisify:)

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

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

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

B

var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
  1. シナリオ A では、 ?task3の結果が得られます。task2B では、最初の約束の結果が得られますか?

  2. Promise.all2 番目のものは、 bluebirdからの実行とどう違うのですか?

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

まとめての質問ですみません。

4

3 に答える 3

48

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

thenあなたの例でどのように機能するか

でのあなたの主張1は正しいです。値を使用して、Bluebird で解決される promise をシミュレートできPromise.resolveます。

これを示しましょう:

promise を返す関数を取得しましょう。

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

foo().then(alert);

この短いスニペットは、ご覧のとおり警告を発し"Value"ます。

それでは、さらに 2 つの Promise を作成してみましょう。それぞれが異なる値をアラートして返します。

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

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

2 番目の例では、タスク 2 とタスク 3 の両方が同じ値を取得し、同時に実行されます (つまり、タスク 3 はタスク 2 を待機しません)。ここでそれを見ることができます。

Promise.all

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

キャッチ

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

于 2014-01-23T02:43:57.300 に答える
3

単純な原則の連鎖が得られない

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

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

2番目のケースでは

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

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

于 2016-03-22T04:54:34.963 に答える