序文
これは第六章で、このシリーズの非同期イベントループを紹介します
非同期知人
非同期相対同期、フォローアップの非同期コードの実行をブロックしない直感的な表現、および同期がブロックされます。
非同期同期はより良いいくつかのよりも見えますが、期待通りではない、同期、非同期操作のコードが書かれたか、実行されたかどうか、です。
非同期初期の経験
setTimeout(()=>{
console.log(1)
},1000)
console.log(2)
我々の予想によれば、コードは、底部、遭遇する遅延など1S出力1、後、及び、出力2に上から実行されます。
実際には、2すぐに出力、1秒後に再び1つの出力。
あなたはそれが原因で1秒に起因する遅延のためだと思うことがあり、実際には、あなたが入れた遅延時間が0に設定されている、第1の出力は2です。
コールバック関数
あなたはリターン同期コードとして直接、非同期操作の結果を取得したい場合は、実質的にすべてのAPIのノードは、非同期である、の届かないです。
非同期操作は、コードの外部の値が実行される非同期の結果がまだ取得していないことを意味実行する後続のコード、もちろん、ないリターン期待される結果をブロックしません。
- 文言は、実際には、外部のリターンの結果が要件を満たしていない、思考が同期されます。
setTimeout(() => {
return 10
}, 1000)
- 彼らは、非同期的な思考がある非同期操作の結果を得ることができる前に来てコールバック関数を渡します
function fn(callback) {
setTimeout(() => {
callback(10)
}, 1000)
}
function callback(data) {
console.log(data)
}
fn(callback)
コールバック地獄
ちょうどあなたが書かれたか、そのようなコードを見ている必要がありますので、コールバック関数を使用して非同期処理結果を達成することができます言及しました。
時間依存要望に応じて次の要求の結果ので、一度にリクエストの上部に操作データを取得する必要があります。
狂気の巣のバーストなら...多分あなたは巣2ストローク明確な、10階建て、それをできますか?悲惨。
axios.post(url1).then(res1 => {
axios.post(url2,{data:res1.data}).then(res2 => {
axios.post(url3,{data:res2.data}).then(res3 => {
...
})
})
})
イベントループ
非同期の一定の理解した後、それを実行するプログラムをスケジュールする方法であるかどうか、シングルスレッドjsの後ろに、表面を超えて参照してくださいするには?イベントループとは何ですか?
リトル・テスト
setTimeout(() => {
console.log('0')
},0);
new Promise(resolve => {
console.log('1');
resolve();
console.log('2');
}).then(() => {
console.log('3')
});
console.log('4');
- あなたは、出力どう思いますか?0,1,2,3,4?コンソールまたはノードを試してみてください
- 答えは1,2,4,3,0
- あなたが完全にクリアされている場合は、良い、背中を読んでいない、あなたはバンバンです
- あなたが無知な力や半理解を見れば、あなたの好奇心を保つ、読み続けます
タスクやスケジューリング処理の課
JSコードの実行は2つのカテゴリに分けることができる:、非同期タスク(プロミス等解決する、定期的なスクリプトタグまたはコードセグメントJSファイル)を同期タスク(のsetTimeoutを約束次いで機能など)タスクスケジューラの実行スタックによって制御されます、特定のスケジューリングプロセスは次のとおりです。
- 登録テーブルでイベントに行くために、非同期タスクを実行するための分割統治の現在のタスクのタスクの実行スタック、メインスレッド同期タスク
- メインスレッド現在のタスクが完了した後、関数呼び出しがあることがあれば、再度、イベントキューをチェックします
- イベントテーブル既に登録されている非同期タスクが完了すると、コールバック関数がイベントキューに配置されます
- メインスレッドはアイドルイベントキューのコールバック関数が実行される読み込み
- すべてのタスクが実行されるまで、上記のプロセスが繰り返されることになる、これはイベントループがあります
アウトプットインタープリタ
スケジューリングプロセス、次の1の1と出力シーケンスを説明するには、まず、最初のサブ同期および非同期タスクの作業を見てサンプルコードを引き起こし言っ
- シンクロナス
new Promise(resolve => {
console.log('1');
resolve();
console.log('2');
})
console.log("4")
- 非同期な
setTimeout(() => {
console.log('0')
},0);
//promise的then函数
then(()=>{
console.log('3')
})
- 実行のメインスレッドの同期コード、上から下へ
- 非同期タスクは、setTimeoutメソッドが発生しただけで登録したタスクリストを約束し、リリース
- 非同期タスクは、イベントキューへのコールバック関数を完了さ
- メインスレッドは、イベントキューのコールバック関数が実行される読み込み
上の説明を読んで、あなたは不思議に思うかもしれませんが、最初の1,2,4の出力同期的に実行
メインスレッドを削除順次実行されるように、コールバック関数を、それは1,2,4,0,3正しいことではないでしょうか?
- 実際には、同期および非同期タスクの簡単な作業だけでなく、より洗練されたマクロタスク(JSコードセグメント全体、タイマー、遅延、等)、およびマイクロタスク(その後の約束、process.nextTick)に加え
- タスクキューは、マイクロマクロタスクキューとタスクキューに細分することができる、メインスレッドの優先度がリードマイクロマクロタスクキュータスクキューよりも高い場合、この関数はそう、遅延よりも高い優先度1,2,4の出力を約束行います3,0
特別な遅延
- 遅延は、イベントキューにコールバック関数の終わりのタイミング、登録からカウントを開始します
- 遅延の遅延時間は、余分な待ち時間を必要とせずに、メインスレッドが直接アイドルと呼ばれていることを意味0に設定されています
- HTMLの標準、4ミリ秒の最小遅延時間、のみだけ近似0
- (例えば10Wサイクルなど)メインスレッドブロックが不正確なタイミング遅延につながります
メインスレッドが無限ループ非同期タスクを実行することができない、ブロックされる原因になります
- このコード行ではなく、出力1、立ち往生
while(true){setTimeout(()=>{console.log(1)})}
統合されたケース
次のコード出力順序が何であるかを推測?
console.log('1');
setTimeout(() => {
console.log('2');
process.nextTick(() => {
console.log('3');
})
new Promise((resolve) => {
console.log('4');
resolve();
}).then(() => {
console.log('5')
})
})
process.nextTick(() => {
console.log('6');
})
new Promise((resolve) => {
console.log('7');
resolve();
}).then(() => {
console.log('8')
})
setTimeout(() => {
console.log('9');
process.nextTick(() => {
console.log('10');
})
new Promise((resolve) => {
console.log('11');
resolve();
console.log('12');
}).then(() => {
console.log('13')
})
})
出力分析