序文
JS非同期プログラミングは、この記事の焦点ではなく、コールバックや発電機の4種類に分けられ、我々はそれを待って、約束と非同期に焦点を当てました。
約束する
まず、私たちは約束のいくつかの機能を見てみましょう。
- その後、遅延コールバックメソッドバインドすなわち、それは引数として、2つのコールバック関数を受け入れることができます。状態プロミスオブジェクトが解決なったとき最初のコールバック関数が呼び出され、2番目のパラメータは、一般的に、その方法は、コールバック関数の実装を遅延するかどうか、キャッチトリガーを使用し、オプションです。
- 戻り値の浸透。
readFilePromise('1.json').then(data => {
return readFilePromise('2.json');
}).then(data => {
return readFilePromise('3.json');
}).then(data => {
return readFilePromise('4.json');
});
次いで、この方法は、約束は後で使用し続けることができます返さ見ることができます。
- エラーバブル、thenable連鎖呼び出しを通じて発生したすべてのエラーは、最後のキャッチで捕捉することができます。
その後、方法
その後、チェーン呼び出しが私の疑問の多くに答えたときに最も重要なのこれらの方法は、私は以下のコードを学んだことは間違いありません。
ノートはその後、2つのパラメータを受信する機能と、第二の代替です。
機能も約束する値を返しますが、かつての場合、彼が使用することを約束宅配バックを呼び出します。後者はまた後で使用するために呼び出されます場合。
var p = new Promise(function(resolve, reject){
resolve(1);
});
p.then(function(value){ //第一个then
console.log(value);
return value*2;
}).then(function(value){ //第二个then
console.log(value);
}).then(function(value){ //第三个then
console.log(value);
return Promise.resolve('resolve');
}).then(function(value){ //第四个then
console.log(value);
return Promise.reject('reject');
}).then(function(value){ //第五个then
console.log('resolve: '+ value);
}, function(err){
console.log('reject: ' + err);
})
実行の決定順序で次一見:
var p1 = new Promise( function(resolve,reject){
console.log('start1')
resolve( 1 );
});
p1.then(
function(value){
console.log('p1 then value: ' + value);
}
).then(
function(value){
console.log('p1 then then value: '+value);
}
);
var p2 = new Promise(function(resolve,reject){
resolve( 2 );
});
p2.then(
function(value){
console.log('p2 then value: ' + value);
}
).then(
function(value){
console.log('p2 then then value: ' + value);
}
).then(
function(value){
console.log('p2 then then then value: ' + value);
}
);
console.log('start2')
実装の最終的な結果は以下の通り:
VM382:2 start1
VM382:33 start2
VM382:8 p1 then value: 1
VM382:22 p2 then value: 2
VM382:12 p1 then then value: undefined
VM382:26 p2 then then value: undefined
VM382:30 p2 then then then value: undefined
解決と拒否
解決に関しては、それは通常の値を受け入れることができます、また約束を受け取ることができます
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('fail')), 3000)
})
const p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000)
})
p2
.then(result => console.log(result))
.catch(error => console.log(error))
状態P2は、我々が無視することができますので、これは、状態の解決P2 P1に依存しているため、プログラムはこのような、P1の前の状態の3000msは、penddingされます。
そして、P2、その後の約束、状態penddingある方法、結果を行きます。
状態変化のP1、P2および直接転送がのP1を拒否するため3000msは、キャッチした後に行きます。
すべてのレース
一つは、成功が誰であるかを高速に実行する人、成功するために完成されています。
もちろん、そのような値の転送など、いくつかの詳細は、そこにあるすべてのレースについては、その後の約束処理をさせて頂きます、約束ではありません。エラー文の約束ならば、この方法は、すべてのより多くのキャッチを行くつもりされていません。