set Timeout async promise実行手順まとめ

2002 ワード

最近プログラムを見て結果の筆記試験問題を書いて気が狂って、最も典型的なのはsettimeoutに属して、async、promise混用の時、どの段階が何を実行するべきですか?
話は多くなくて、先にコードをかけます.
        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は反対です.