set Timeout async promise実行手順まとめ
2002 ワード
最近プログラムを見て結果の筆記試験問題を書いて気が狂って、最も典型的なのはsettimeoutに属して、async、promise混用の時、どの段階が何を実行するべきですか?
話は多くなくて、先にコードをかけます.
はい、答えを見に来ました.
promiseオブジェクトを作成するコードは同期コードに属しています.promiseの非同期性はthenとcatchに反映されていますので、promise 1は出力されて、then関数のコードをキューに入れて、同期コードを継続して実行して、script endを出力します.
これまで同期コードの実行が完了し、タスクの実行が開始されました.先ほど述べたように、setTimeoutのタスクキュー優先度がpromiseキューより低いため、まずpromiseキューの最初のタスクを実行し、thenメソッドの一部を実行し、promise 2を出力し、async 1のawaitの後のコードを実行して、async 1 endを出力します.
最後にpromiseキューでタスクの実行が完了したら、setTimeoutのタスクキューを実行して、settimeoutを出力します.
ここで、この問題の出力結果の分析が終わりました.このような実行結果は一言でまとめて、まず同期コードを実行して、非同期コードがあったら先に列に参加して、入隊順に非同期コードを実行して、最後にset Timeout列のコードを実行します.
列のタスク優先度を追加します.promise.Trick()>promiseのフィードバック>async>set Timeout>set Immedite、
でももし
話は多くなくて、先にコードをかけます.
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log( 'async2');
}
console.log("script start");
setTimeout(function () {
console.log("settimeout");
},0);
async1();
new Promise(function (resolve) {
console.log("promise1");
resolve();
}).then(function () {
console.log("promise2");
});
console.log('script end');
問題の出力結果を自分で考えてみてもいいです.はい、答えを見に来ました.
script start
async1 start
async2
promise1
script end
promise2
async1 end
settimeout
一つ一つ分析してみます.await async2();// , async2 ,await , , test()
setTimeout関数に実行した場合、そのコールバック関数をキューに追加します.このキューはpromiseキューと同じキューではなく、実行の優先度がpromiseより低いです.続行promiseオブジェクトを作成するコードは同期コードに属しています.promiseの非同期性はthenとcatchに反映されていますので、promise 1は出力されて、then関数のコードをキューに入れて、同期コードを継続して実行して、script endを出力します.
これまで同期コードの実行が完了し、タスクの実行が開始されました.先ほど述べたように、setTimeoutのタスクキュー優先度がpromiseキューより低いため、まずpromiseキューの最初のタスクを実行し、thenメソッドの一部を実行し、promise 2を出力し、async 1のawaitの後のコードを実行して、async 1 endを出力します.
最後にpromiseキューでタスクの実行が完了したら、setTimeoutのタスクキューを実行して、settimeoutを出力します.
ここで、この問題の出力結果の分析が終わりました.このような実行結果は一言でまとめて、まず同期コードを実行して、非同期コードがあったら先に列に参加して、入隊順に非同期コードを実行して、最後にset Timeout列のコードを実行します.
列のタスク優先度を追加します.promise.Trick()>promiseのフィードバック>async>set Timeout>set Immedite、
でももし
await
後に続く Promise
async1 end
3つのtickを待ってから実行できます.実際にはこの性能は比較的遅いので、V 8チームはNode 8のBugを参考にして、エンジンの下で3回のtickを2回のtickに減らしました.つまりv 8エンジンのブラウザから印刷されたもので、promise 2とasync 1 endは反対です.