まず、タスクキューを理解します
JavaScriptエンジンは一度だけのコードのブロックを実行することができ、コードの一部を実行する準備ができているすべての時間は、タスクキューに追加されます。コードJavaScriptエンジンの完全な実装した後、その後、タスクキュー内の次のタスクを実行します。
1 < スクリプト> 2 。3 。4 / * 。5 。6 のコードを実行する準備ができているときはいつでも、コードのブロックのみを実行することができるJavaScriptエンジン同じ時間は、ジョブキューに追加されます。 7 エンジンは、タスクキューに次のタスクを実行するJavaScriptコードの実行を完了します。 8 。9 * / 10 。11 関数のfoo(){ 12である (にconsole.log ' FOOスタート' ) // ステップ 13で 、関数(){バー 14 はconsole.log(' バー' ) 15 } 16 console.log(' テスト' ) // 第二段 17 バール() // バー()を呼び出す第3の工程と、 18がある にconsole.log(' FOOエンド' ) // 第四のステップ 19 } 20は 21である (FOO) ; 22は 23である </ スクリプト>
FOOを呼び出すときに、図1の例では、()関数、関数foo()は 関数の完了を行った後、ジョブキューに送信される 関数foo()が タスクキューから撮影されます
FOO()関数を呼び出す、実施例2、関数foo()を 遭遇し、ダウンした後、タスクキューに、およびbar()の 後に 関数bar() キューにタスクの後に、機能の実行が完了すると、最初にエグゼクティブ 関数bar() その後、実行 ()関数fooを (キュースタックに対応するタスクキュー)
1.2前研究のプログラム
1 < ボディ> 2 < スクリプト> 3。 4。 5。 6。 // 非同期プログラミングモード:イベントコールバック、コールバック関数、プロミス 。7 。8 // イベントコールバック 。9 // CONST =新しい新しいXHRのXMLHttpRequest(); 10 // xhr.onreadystatechange =関数(){ 11 // IF(xhr.readyState === 4){ 12れる // //ここコードは、要求の完了後に実行される 13 // } 14 // }; 15 16 // コールバック関数は、 17。 機能FOO (FUN){ 18であります setTimeout(()=> { 19 // のfoo()関数すなわちパラメータ楽しみ、タスクバー着信機能の完了後に呼び出される 20 はconsole.log(' FOOタスク完了' ); 21は ファン(); 22です }、2000 ) 23である } 24 25 関数バー(){ 26である にconsole.log(' バータスク完了' ) 27 } 28 29 // パラメータ渡されるのfoo()関数のような関数bar() 30 FOO(バー) 31が 32 < / スクリプト> 33 </ ボディ>
1.3非同期プログラミング-Promiseオブジェクト
1 < ボディ> 2 < スクリプト> 3。 4。 // プロミスオブジェクトは非同期動作を表す3つの状態がある:保留中(進行中)、成就は(失敗)(成功した)と拒否 5。 6。 プロミスCONST = 新しい新しいプロミス(関数(解決拒否){ 7 。8 // タスク正常、コール解決()関数を実行する 。9 10 @ タスク実行の失敗、()関数の呼び出しを拒否する 。11 12れる IF (偽の){ 13は 解決(「最初のタスクの実行完了後に得られた結果' ) 14 }他{ 15 (拒否「失敗したタスクのための第二の理由を知らせる」) 16 } 17 18れる )}; 19 である20 // 成否監視しながらコールバック1. 21れる promise.then(関数(値){ 22である // タスクが正常に実行され、ここでコードを実行し、着信タスクの機能に得られる結果である場合 23である にconsole.log(値) 24 }、関数(理由){ 25 // タスクの実行の失敗、コードが実行される場合、関数に渡されたタスクの失敗の原因 26がある にconsole.log(理由) 27 }); 28 29 // 2.成功したコールバック・リスナーのみ 30 promise.then(関数(値){ 31は、 // タスクが実行されると正常にここでコードを実行し、着信にタスクの結果の関数で 32 コンソール.logの(値) 33である )}; 34である 35 // のみ3.聞く失敗したコールバック 36 promise.thenを(NULL 、関数(理由){ 37 // タスクの実行の失敗が、ここでコードを実行するとき、機能タスクの失敗の理由通過 38である にconsole.log(理由) 39 }); 40 41れる // 4キャッチ()のみエラーハンドラを通過次いで()メソッドに対応する方法。上記のコードは以下の文言に等しい: 42である プロミス。キャッチ(関数(理由){ 43 にconsole.log(理由) 44 }) 45 46 </ スクリプト> 47 </ ボディ>