正式な紹介を開始する前に、JavaScriptの約束がどのように見えるかを見たいと思います。
コードコピーは次のとおりです。
var p = new Promise(function(Resolve、拒否){
Resolve( "Hello World");
});
p.then(function(str){
アラート(str);
});
1。その後()はフォークされた約束を返します
次の2つのコードの違いは何ですか?
コードコピーは次のとおりです。
//展示a
var p = new Promise(/*...*/);
p.then(func1);
p.then(func2);
//展示b
var p = new Promise(/*...*/);
P.Then(FUNC1)
.then(func2);
上記の2つのコード相当を慎重に検討する場合、約束はコールバック関数の1次元配列にすぎません。ただし、そうではありません。それぞれ()コールは、フォークされた約束を返します。したがって、展示物では、func1()が例外をスローする場合、func2()は依然として正常に呼ばれます。
exvishingBでは、func1()がエラーをスローする場合、最初の呼び出しが新しい約束を返すため、fun2()は呼び出されません。これはfunc1()で拒否されます。その結果、func2()がスキップされます。
要約:約束は、複雑なフローチャートと同様に、複数のパスに分岐できます。
2。コールバックは結果に渡す必要があります
次のコードを実行すると、何が警告が表示されますか?
コードコピーは次のとおりです。
var p = new Promise(function(Resolve、拒否){
Resolve( "Hello World");
});
p.then(function(str){})
.then(function(str){
アラート(str);
});
2番目のアラート()には何も表示されません。これは、コールバック関数が約束のコンテキストで、結果が変化するため、コールバック関数がないためです。 Promiseは、コールバックが同じ結果または交換結果を返すことを期待しており、次のコールバックに渡されます。
次のように、AdPaterを使用して結果を変更するのと同様です。
コードコピーは次のとおりです。
var feettometres = function(ft){return ft*12*0.0254};
var p = new Promise(/*...*/);
P.then(feettometres)
.then(function(meters){
アラート(メートル);
});
3.前のレイヤーからの例外のみをキャッチできます
これら2つのコードの違いは何ですか?
コードコピーは次のとおりです。
//展示a
新しい約束(function(Resolve、拒否){
Resolve( "Hello World");
})
。それから(
関数(str){
新しいエラー( "uh oh");
}、
未定義
))
。それから(
未定義、
関数(エラー){
アラート(エラー);
}
);
//展示b
新しい約束(function(Resolve、拒否){
Resolve( "Hello World");
})
。それから(
関数(str){
新しいエラー( "uh oh");
}、
関数(エラー){
アラート(エラー);
}
);
最初のコードでは、最初の()の例外がスローされ、2番目のthin()によってキャッチされ、「uh oh」警告がトリガーされます。前のレベルでのこのガイドのみの例外がキャッチされます。
2番目のコードでは、コールバック関数とエラーコールバック関数が同じレベルにあります。つまり、例外がコールバックにスローされた場合、キャッチされません。実際、2番目のコードのエラーコールバックは、約束が拒否された場合、または約束自体が間違っている場合にのみスローされます。
4。エラーを復元できます
エラーコールバック関数では、エラーを再スローしない場合、エラーから回復し、解決状態に反転したことを約束します。次の例では、「I'm Saved」が表示されます。これは、最初の()のエラーコールバックが例外を再スローしなかったためです。
コードコピーは次のとおりです。
var p = new Promise(function(Resolve、拒否){
拒否(新しいエラー( "Pebkac"));
});
p.then(
未定義、
関数(エラー){}
))
。それから(
関数(str){
アラート(「私は救われました!」);
}、
関数(エラー){
Alert( "Bad Computer!");
}
);
約束は、タマネギの層として見ることができます。それぞれ()はタマネギに別のレベルを追加します。各レベルは、処理されたアクティビティを表します。階層が終了すると、結果は修正されており、次の階層に対応していると見なされます。
5。約束を一時停止できます
1つの()メソッドで実行する準備ができているため、事前に一時停止して他のものを実行できないという意味ではありません。 現在の約束を一時停止するか、それが別の約束を完了するのを待たせるために、単に別の約束を返します()。
コードコピーは次のとおりです。
var p = new Promise(/*...*/);
p.then(function(str){
if(!loggedin){
新しい約束を返す(/*...*/);
}
})
.then(function(str){
alert( "done。");
})
前のコードでは、新しい約束が解析されるまでプロンプトは表示されません。これは、既存の非同期コードパスでより多くの依存関係を導入する便利な方法です。たとえば、ユーザーセッションにタイムアウトがあることがわかり、前のコードパスを続行する前に2番目のログインを初期化することをお勧めします。
6.解決された約束はすぐには実行されません
次のコードを実行するときにプロンプトボックスを取得しますか?
コードコピーは次のとおりです。
関数runme(){
var i = 0;
新しい約束(function(resolve){
解決する();
})
.then(function(){
I += 2;
});
アラート(i);
}
約束はすぐに解析され、その後()メソッドはすぐに実行されるため、プロンプト2が調査されると思われる場合があります。ただし、約束の定義では、すべての呼び出しが非同期に強制される必要があります。したがって、プロンプトは変更される前に生成されます。