promiseとsetTimeoutの実行順序問題


ある時、面接問題の中でプロミゼとsetTimeoutの実行順がありました.その時はちょっとばかばかしくて、実行順序はちょっと間違っていました.ここにメモしてください.
1.出力
setTimeout(function() {
    console.log(111)
}, 0);
setTimeout(function() {
    console.log(333)
}, 1000);
new Promise(function(resolve){
    console.log(444);
    resolve();
    console.log(555);
}).then(function(){
    console.log(666);
});
console.log(777);
async function test1() {
    console.log("test1");
    await test2();
    console.log("test1 last");
}
async function test2() {
    console.log("test2");
}
test1();
  • 出力結果
  • 2.個人的な理解
  • は、最初に同期コードを実行し、次いでイベントポーリング方式で非同期コード
  • を実行する.
  • promiseにおける非同期は.then()と.catch()において
  • でpromiseのfunctionには同期コード
  • があります.
  • 上のコードはプロミセの同期コードを先に実行し、スクリプト内の自身の同期コード
  • を実行します.
  • asyncは、方法が同期であろうと、非同期であろうと、asyncキーで識別することができる
  • .
  • asyncで識別すると、この方法ではawaitキーワードを用いて非同期化する可能性があることを示すだけでなく、この非同期方法を明確に区分し、awaitキーワードを使用した場合のみ非同期動作であり、残りは一括して同期動作
  • である.
  • はGenerator関数と同じで、async関数はPromiseオブジェクトに戻り、then方法を使用してコールバック関数を追加することができます.
  • 関数が実行されると、awaitが発生すると、先に戻り、トリガされた非同期動作が完了するまで、関数の内部にあるステートメント
  • が実行される.
  • awaitコマンドの後のPromiseオブジェクトは、実行結果がrejectである可能性がありますので、awaitコマンドをtry...catchコードブロックの中に入れた方がいいです.
    3.その他
  • はネット上でまたいくつか資料を探し当てました.
    この文章のいくつかの内容を参考にして文章を参考にした.
    setImmediate(function(){
        console.log(1);
    },0);
    setTimeout(function(){
        console.log(2);
    },0);
    new Promise(function(resolve){
        console.log(3);
        resolve();
        console.log(4);
    }).then(function(){
        console.log(5);
    });
    console.log(6);
    process.nextTick(function(){
        console.log(7);
    });
    console.log(8);
  • 出力結果:3 4 6 8 5 2
  • macro-task: script (    ),setTimeout, setInterval, setImmediate, I/O, UI rendering. 
    micro-task: process.nextTick, Promise(  ),Object.observe,MutationObserver
  • 第一歩.script全体コードが実行され、実行プロセスは
  • である.
      setImmediate macro-task
      setTimeout macro-task
      micro-task Promise.then    ,   script console.log(3); resolve(); console.log(4);     3 4,  resolve   ,              ,    Promise.then   。
    console.log(6)  6
    process.nextTick   micro-task
    console.log(8)   8 
  • 最初のプロセスの後、すでに3 4 6 8
  • が出力されました.
  • 第二ステップ.他のmicro-taskの優先度がmacro-taskより高いためです.
  • この時、micro-taskの中に優先順位プロcess.nextTickがPromiseより高い二つのタスクがあるので、先に7を出力して、5
  • を出力します.
  • 第3ステップ、micro-taskタスクリストはすでに実行済みで、家に来てmacro-taskを実行します.setTimeoutの優先度がsetImmediteより高いので、先に2を出力して、もう1を出力します.
  • 優先度:promise.Trick()>promiseのフィードバック>setTimeout>setImmedite
    一生懸命勉強しています.勉強に役立つなら、印をつけてください.
  • 以前の好文おすすめ:
  • は、iOSとAndroidおよびPC端末
  • を判断する.
  • 純粋なcssは滝の流れを実現します.
  • 複数行の文字と単一行の略号
  • を実現します.
  • マイクロクレジットの買い物車と親子部品の値段及びcall cの注意事項