- 個人的な理解
前景 - コードの出力は何ですか
キューが循環している場合、同期タスクは非同期タスクよりも大きい (非同期タスク内のマイクロ タスクはマクロ タスクよりも大きい) ことは誰もが知っているので、このコードの出力はどうなるでしょうか?
<script>
setTimeout(() => {
console.log(1);
}, 0);
new Promise(function(resolve,reject){
console.log(2);
resolve();
console.log(3);
}).then(function(){
console.log(4);
}).finally(function(){
console.log(5);
});
console.log(6);
</script>
- あなたはそれを作りましたか?私は次の答えを投稿します
- 答え
2 3 6 4 5 1
見込み客分析
-
まず、同期>非同期ということは知っていても、同期と非同期の区別がつかないかもしれませんが、実際には次の非同期タスクだけ覚えておいてください。それ以外はすべて同期タスクです。
-
非同期タスク:
setTimeout
、setInterval
、setImmediate(非标准)
、I/O
、UI rendering
Promise
-
promise はマイクロタスクであるため、promise の優先度は他の非同期タスクよりも高いことも知っておく必要があります。
-
ただし、promise が作成されると同期的に実行され、非同期で実行されるため(つまり、.then、.catch のメソッド)、promise が非同期タスクであると言うのは完全に正しいとは言えません
nextTick
。前景の例は非常によく状況を示していますnew Promise(resolve=>{ console.log(1); resolve(3); }).then(num=>{ console.log(num); }); console.log(2); //依次为 123
以上の点を学んだので、Promise.all メソッドを見てみましょう。
- これまで、
Promise.all
メソッドが複数の promise を新しい promise インスタンスにカプセル化し、結果を同期的に取得できる理由を常に疑問に思っていました. 今ではその理由がわかりました. 最初に次のコードを見て、後で詳しく説明しましょう.
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.1.3/axios.min.js"></script>
<script>
let work1 = new Promise((resolve,reject)=>{
resolve(axios.get('https://api.oick.cn/dutang/api.php'))
});
let work2 = new Promise((resolve,reject)=>{
resolve(axios.get('https://api.oick.cn/yiyan/api.php'))
});
let work3 = new Promise((resolve,reject)=>{
resolve(axios.get('https://api.oick.cn/dog/api.php'))
});
Promise.all([work1,work2,work3]).then(res=>{
console.log(res);
})
</script>
-
上記のコードを見て、なぜこれを同時に行うことができるのかを考えていました.私の頭の中での同時実行性は、このリクエストが同時に送信されることですが、Promise.allが同時に複数のインターフェースをリクエストできることがわかりました.この文The words are wrong~後でデバッグしたところ、ajaxリクエストが同時に送信されたのではなく、順番に送信され、最終的に返された結果が均一に処理されたことがわかりました
-
jsはシングルスレッドであることが分かっているので、同期と非同期に分かれますが、Promiseを作ると同期で実行され、非同期で実行されるので、Promiseの関数は同期タスク
nextTick
です。
let work1 = new Promise((resolve,reject)=>{
//同步任务
resolve(axios.get('https://api.oick.cn/dutang/api.php'))
});
let work2 = new Promise((resolve,reject)=>{
//同步任务
resolve(axios.get('https://api.oick.cn/yiyan/api.php'))
});
- そのため、呼び出しの前に
promise.all
ajax リクエストが送信されましたが、 promise.all で.then
のみ受信および処理されます。
同時に送信された場合は、デバッグ時に ajax 送信リクエストを実行するために Promise.all を指定する必要があることがわかりますが、コードをlet work2
実行する前に少し間をおいてからメソッドを実行する準備をし、過去数日間のデータ リクエスト ステータスが 200 であることがわかります。また、このリクエストは、このコードの実行時に ajax リクエストを送信する代わりに、promise.all の前にも送信されます。let work3
promise.all
promise.all
- しばらく待ってからデバッグを終了したところ、通常の出力で返された結果がタイムアウトしていないことがわかりました。つまり、
promise.all
リクエストを送信していないということですが、promise.all
最終的な処理を行っているということです。