私は数日だけブルーバードを使用してきましたが、古いコードとpromisify
itをすべて調べたいです:)
私の問題は、then()
コマンドのフローをまだ完全に把握していないことです。
次の2つのブロックを検討してください。
A
methodThatReturnsAPromise().then(task2).then(task3);
B
var promise = methodThatReturnsAPromise();
promise.then(task2)
promise.then(task3);
シナリオAでは、task3
はtask2
の結果を取得しますか? Bでは、全員が最初の約束の結果を取得しますか?
2つ目はPromise.all
をbluebirdから実行することとどう違いますか?
catch
メソッドの使用に関して、これらのA/B/Promise.all
はどのように異なりますか(どこに配置しますか)。
申し訳ありませんが、1つの質問の束です。
素晴らしい約束の世界へようこそ。
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(または単にthen
フルフィルメントハンドラから配列を返し、.spread
を使用)は、複数の結果がすべて完了するのを待つために使用されます。あなたの例では、複数の部分の単一の結果をフックしています。
エラーをキャッチする場所に常にcatchを配置します。通常の同期コードのように。常に約束または約束されたコードを常にスローすることを忘れないでください。
シナリオ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)
あなたは1つの単純な原則を得ていません連鎖
最初のように書くことができます
var promise = methodThatReturnsAPromise(), promise1 = promise.then(task2); promise1.then(task3);
第二の場合
var promise = methodThatReturnsAPromise(); promise.then(task2) promise.then(task3);
これが2つの違いを説明することを願っています