この記事があなたにもたらすのは、JS 実行メカニズムの概念ですか? js実行機構の実装方法は参考になると思います。
実際の開発では、リクエストが完了した後、リクエストで取得したデータを特定のオブジェクトや変数に代入したいことがありますが、リクエストのコールバック関数では値を代入するのではなく、以下の値を代入します。 request ステートメントを見ると、データを取得するリクエストは正常ですが、代入後の変数が未定義であることがわかります。どうしてこれなの?
まず第一に、同期と非同期という概念を理解する必要があります。ご存知のとおり、js はシングルスレッド言語です。つまり、js は一度に 1 つのタスクしか実行できません。タスクが複数ある場合、それらはタスクの順序で実行されます。ただし、無限ループに陥るなど、タスクの 1 つに時間がかかると、他のタスクが実行できなくなり、ブラウザが応答しなくなります。では、js はどのようにしてそれを解決するのでしょうか?それは、タスクを同期モードと非同期モードに分割して実行することです。同期とは上記のとおりであり、非同期とはタスクが終了したときに次のタスクを実行せずにコールバック関数を複数実行することを意味します。 ?違いは、後のタスクは、前のタスクの実行が完了するまで待つ必要がないことです。したがって、取得するプログラムの実行順序はタスクの順序ではありません。
setTimeout(function(){ console.log('第一个延时调用'); }); console.log('哈哈哈'); new Promise(function(resolve){ console.log('promise任务吗'); resolve(); }).then(function(){ console.log('回调函数???') }); console.log('嘻嘻嘻'); setTimeout(function(){ console.log('第二个延时调用'); });
実行結果は何ですか?
ははは
約束タスク
ふふふ
コールバック関数? ? ?
1回目の遅延通話
2回目の遅延通話
これはなぜですか?なぜ最後にsetTimeoutが実行されるのでしょうか?明らかに0msです。
これは、同期モードと非同期モードに加えて、タスクをさらにマクロタスクとマイクロタスクに分割したためです。
マクロ タスク: コード スクリプト全体、setTimeout、setInterval を含む
マイクロ タスク: Promise、process.nextTick
実行中、マクロ タスクに入った後、最初のループが開始され、その後すべてのマイクロ タスクが実行され、次に次のステップが実行されます。マクロタスクは周期です。
上記のコードでは、マクロタスクを入力し、setTimeoutをマクロタスクとして登録し、キューに入れてから実行します。ハハハ、新しいPromiseが見つかったら、それを直接実行し、コールバック関数がマイクロタスクキューを配置し、2番目のPromiseを実行します。 setTimeout 上記と同様。次にマイクロタスクを実行します。ここではヒヒヒヒするだけです。最後に次のマクロ タスクを入力します。
関連する推奨事項:
以上がjsの実行機構の概念とは何ですか? js実行機構の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。