すべてのタスクが同期タスクの2種類に分けられ、一つは非同期タスクです。
;メインスレッドのタスクの実行のためにキューイング同期タスク手段は、最初のタスクが実行された後のタスクに終了する
に、非同期タスクの意味、メインスレッドを入力しないでください「タスクキュー」(タスクキュー)のこうしたメインスレッドのみタスクが、終了するなどのタスク、「タスクキューは」、メインスレッドに通知するタスクを実行するための要求を開始し、タスクがメインスレッドを入力します。ここに来て、「キュー」 (ある、タスクキュー)、それが何であるかを置くためにキューが、置いてあるのsetTimeout 関数を、機能のすべてであるキュー、キューに追加機能プログラムでは、キューになりますがすべてのコードは、これが理由です、この実行が完了した後に外部に再び実行されますか?プログラムの実装では、ブラウザは、デフォルトするためのsetTimeoutをし、AJAX リクエストメソッドこのタイプの時間がかかり、キューに追加された(それは時間がかかることがないかもしれないが)手順は、キューがストア時間のかかる手順にキューされています、時間のかかるプログラムの実行せずに、すべての後に、再びキューにおけるプログラムの実施が続きます。次のように具体的には、非同期動作の機構です。
(1 )すべての同期タスクは、スタック実行(形成するメインスレッドで実行される実行コンテキストスタック)。
(2 加算)メインスレッドが、ある「タスクキュー」(タスクキュー)。で実行時間の長い非同期タスクの結果と「タスクキュー」イベントに置かれています。
(3 一度)、「実行スタック」のすべての同期タスクが終了すると、システムは読みます「タスクキューを」そこに何のイベントを見るために。実行スタックにこれ待ち状態を終了する非同期タスクを、対応するものを、開始しました。
(4 )メインスレッドは、上記の第3工程を繰り返します。
setTimeoutメソッドコールバック関数への関数で同期タスク、setTimeoutメソッドへの循環のための機能非同期タスク、。実行順序:脇同期優先順位、非同期コールバック底。だから、時間パラメータが0のsetTimeoutであっても、まだの代わりに、メインスレッドの、タスクキューを置きます。非同期タスクを実行するには、メインスレッドが唯一のためのループが完了した後のsetTimeout。「タスクキュー」へのイベントことを除いて、加算のsetTimeout()では、現在のコード(実行スタック)が実行されるまで待つ必要があり、メインスレッドは、その指定されたコールバック関数を実行するために行くだろう。現在のコードに時間がかかる場合、それは長い時間を待たなければならないこと、およびsetTimeoutメソッドで指定された()の実行時間になりますコールバック関数を保証する方法はありません。
Javascriptをシングルスレッドです。シングルスレッドの手段は、すべてのタスクは、ミッションの終了前に、後にタスクを実行し、ラインアップする必要があります。タスクは長い時間前にかかる場合は、その後のタスクが待っていました。だから、概念がある- タスクキューは。計算集約、ためキューがある場合はCPU 忙しく、彼らはうまくやってますが、何回ものCPUがあるため、アイドル状態のIOの(ようなデバイス(入出力装置)が非常に遅いのAjax 操作はネットワークからデータを読み込む)、持っていました結果が出て、その後、ダウン実行を待っています。だから、JavaScriptは言語は、メインスレッドは関係なく、できることを実現し、設計者のIO デバイス、待ちタスクでハングは、背面にタスクを実行します。まで待ってIOの実行を継続するために、デバイスは、結果を返し、その後、戻ってきて、保留中のタスク。
JavaScriptがシングルスレッドであり、その関連する目的。ブラウザのスクリプト言語としては、JavaScriptの主な目的は、ユーザと対話することで、同様に動作してDOMを。これは、それが唯一のシングルスレッド、それ以外の場合は非常に複雑な同期の問題をもたらすことができると判断しました。例えば、仮定JavaScriptを2つのスレッドが存在するが、1つのスレッドDOMは、コンテンツノード、このノードを削除するには、別のスレッド、スレッドが優先すべきブラウザを追加しますか?
だから、生まれてから、煩雑さを避けるために、JavaScriptは言語の特徴、および変更されません中核となっていた、シングルスレッドです。
注:シングルスレッドいわゆるは、を参照JS 解釈し、実行エンジンを担当するJavaScriptはコードが一つだけあるスレッド。
概要:コンピューターの同期を使用すると、スペアタイヤの記事であれば、あなたがするために、爆発の後に百の前で待たなければならない、待っている「との契約」あなた。非同期は、あなたが記事であっても、あなたはどのように感じるか、彼女が世話をすることができるということです。
- jsが同期されていますか?はい、シングルスレッド、それだけで同期させる必要があります(キュー)、わずかに実行します
- JS なぜ非同期は?場合はJSの非同期に存在しない、だけで上から下に実行することができ、ラインは解決するのに非常に長い時間である場合には、次のコードがブロックされます。ユーザーの場合、遮断手段「スタック」、これが悪いユーザーエクスペリエンスにつながります
例:
言い換えれば、のsetTimeout 関数はすぐに実行されていない、いくつかの時間遅延は、特定の条件が満たされた後、のみ実行されるように、このようなコード、我々は非同期コードを呼び出します。
要約:同期が一貫した順序を保証しますが、簡単に閉塞につながる、非同期、ブロッキングの問題を解決することができるが、それは別のニーズに応じてコードを書くために、自然の順序を変更します。
約束は、彼が可変内部同期コードを実行するので、ここでは、()約束とキャッチ()メソッド、または同期約束自体を指し、非同期です。(同期優先)
なお、 new Promise()
その同期方式はresolve
非同期メソッドです。
同期(約束)> 非同期(マイクロタスク(process.nextTick 、Promises.then、Promise.catch 、resoveは、拒否、MutationObserverは)>マクロ(setTimeoutを、と考えたsetInterval 、setImmediate ))
process.nextTick> Promises.then
同期コードの実行が完了した後、それが非同期実行に行く時間がの非同期実行に来ている場合でも、。
JavaScriptのマイクロタスク(タスクにマイクロタスク)とマクロタスク(タスク)。
- AcerはJSを実行するようになった主なタスクは、マクロタスクで実行するように、マクロタスク、一つ一つを開くことです。
- マクロは、同時に複数のタスクを持つことができますが、順番はひとつずつ実行されます。
- 命令またはマイクロタスクキュー方法がある場合、後で、それはマイクロタスクキューに実行することができ、各マクロタスク、そうでない場合、マクロを実行次のタスクは、すべてのマクロタスクの実行が消耗されるまで、マイクロマクロ小さな尾のタスクに相当タスク。
- マクロタスクを持っているなぜ、マイクロタスクが存在するがあるでしょうか?マクロタスクがあまりにも財産を占有しているので、あなたが良い方法を必要とするとき、以前の準備のいくつかは、最終的に実行するための時間になりましたが、また、マクロタスクを追加したくない、あなたは、これらのメソッドを使用することができ、マイクロタスクキューの内側に一つずつ実行このマクロタスク内のコードは、マイクロタスクキューを実行します。
[ マクロタスク:マクロタスク]
- 定时器
- 事件绑定
- ajax
- 回调函数
- Node中fs可以进行异步的I/O操作
[微任务:micro task]
- Promise(async/await) => Promise并不是完全的同步,当在Excutor中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会再去调用resolve/reject把存放的方法执行
- process.nextTick (node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找)
- MutationObserver (创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。)
任务队列到达时间后先进先出的原则
参考:
1:https://blog.csdn.net/qq_40959677/article/details/95961443