タグ付けされた質問 「event-loop」

17
なぜsetTimeout(fn、0)が時々役立つのですか?
最近、かなり厄介なバグに遭遇しました。コードが<select>JavaScriptを介して動的にロードされていました。この動的にロード<select>された値は事前に選択されていました。IE6では、我々はすでに選択を修正するためのコードを持っていた<option>、時にはので、<select>のselectedIndex値は、選択と同期してだろう<option>s 'はindex以下のように属性: field.selectedIndex = element.index; ただし、このコードは機能していませんでした。フィールドselectedIndexが正しく設定されていたとしても、間違ったインデックスが選択されることになります。ただし、alert()適切なタイミングでステートメントを挿入した場合、正しいオプションが選択されます。これはある種のタイミングの問題かもしれないと思い、以前コードで見たランダムなものを試しました: var wrapFn = (function() { var myField = field; var myElement = element; return function() { myField.selectedIndex = myElement.index; } })(); setTimeout(wrapFn, 0); そしてこれはうまくいきました! 私には問題の解決策がありますが、なぜこれが問題を解決するのか正確にわからないので不安です。正式な説明はありますか?を使用して「後で」関数を呼び出すことで、どのブラウザの問題を回避できsetTimeout()ますか?

7
Nodejsイベントループ
nodejsアーキテクチャには内部的に2つのイベントループがありますか? libev / libuv v8 JavaScriptイベントループ I / O要求で、ノードはlibeioへの要求をキューに入れ、li​​beioはlibevを使用してイベントを介してデータの可用性を通知し、最後にそれらのイベントはコールバックを使用してv8イベントループによって処理されますか? 基本的に、libevとlibeioはどのようにnodejsアーキテクチャに統合されていますか? nodejsの内部アーキテクチャを明確に示すために利用できるドキュメントはありますか?

3
イベントループコンテキスト内のマイクロタスクとマクロタスクの違い
Promises / A +仕様を読み終えたところで、microtaskとmacrotaskという用語に出会いました。http://promisesaplus.com/#notesを参照してください。 私はこれまでこれらの用語を聞いたことがありませんでした、そして今、私はその違いが何であるかについて知りたいですか? 私はすでにウェブ上でいくつかの情報を見つけようとしましたが、私が見つけたすべてはw3.org Archivesからのこの投稿です(これは私には違いを説明していません):http : //lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html さらに、「macrotask」と呼ばれるnpmモジュールを見つけました。https://www.npmjs.org/package/macrotask 繰り返しますが、正確な違いは明確ではありません。 で説明したように、すべてのI knowが、それはイベントループとは何かを持っていること、であるhttps://html.spec.whatwg.org/multipage/webappapis.html#task-queue と//html.spec.whatwg:HTTPS .org / multipage / webappapis.html#perform-a-microtask-checkpoint このWHATWG仕様を考えると、理論的には自分で違いを抽出できるはずです。しかし、専門家による短い説明から他の人も同様に恩恵を受けることができると私は確信しています。

3
イベントループについて
私はそれについて考えています、そしてこれは私が思いついたものです: 次のようなコードがあるとします。 console.clear(); console.log("a"); setTimeout(function(){console.log("b");},1000); console.log("c"); setTimeout(function(){console.log("d");},0); リクエストが届き、JSエンジンは上記のコードの実行を段階的に開始します。最初の2つの呼び出しは同期呼び出しです。しかし、setTimeoutメソッドに関しては、非同期実行になります。しかし、JSはすぐにそれから戻って、実行を継続する、と呼ばれていますNon-BlockingかAsync。そしてそれは他にも取り組んでいます。 この実行の結果は次のとおりです。 acdb つまり、基本的には2番目setTimeoutが最初に終了し、そのコールバック関数は最初のものよりも早く実行され、それは理にかなっています。 ここではシングルスレッドアプリケーションについて説明します。JS Engineはこれを実行し続け、最初のリクエストが終了しない限り、2番目のリクエストには進みません。しかし良い点は、setTimeout解決するようなブロック操作を待たないため、新しい着信要求を受け入れるため、処理が速くなることです。 しかし、私の質問は次の項目に関して発生します。 #1:シングルスレッドアプリケーションについて話している場合setTimeouts、JSエンジンがより多くのリクエストを受け入れて実行する間に、どのメカニズムが処理しますか?シングルスレッドは他のリクエストに対してどのように機能し続けますか?何が上で動作しsetTimeout、他の要求がでてくると実行を取得しています。 #2:これらのsetTimeout関数がバックグラウンドで実行され、さらに多くのリクエストが入って実行されている場合、バックグラウンドで非同期実行を実行するものは何ですか?私たちが話しているこのことは何と呼ばれていEventLoopますか? #3:しかし、メソッド全体をに入れEventLoopて、全体が実行され、コールバックメソッドが呼び出されるようにしないでください。これは、コールバック関数について話すときに理解できることです。 function downloadFile(filePath, callback) { blah.downloadFile(filePath); callback(); } しかし、この場合、JSエンジンは非同期関数であるかどうかをどのようにして認識し、コールバックEventLoop? Perhaps something like theをC#のasync`キーワードに入れるか、JSエンジンが行うメソッドが非同期メソッドであることを示す何らかの属性を置くことができます。それに応じて処理する必要があります。 #4:しかし、記事は、物事がどのように機能しているのかについて私が推測していたこととはまったく逆のことを言っています。 イベントループは、コールバック関数のキューです。非同期関数が実行されると、コールバック関数がキューにプッシュされます。JavaScriptエンジンは、非同期関数が実行された後のコードが実行されるまで、イベントループの処理を開始しません。 #5:この画像は参考になるかもしれませんが、画像の最初の説明は、質問番号4で述べたものとまったく同じことを言っています。 だから私の質問は、上記の項目についていくつかの説明を得ることですか?

3
Node.jsイベントループティックとは正確には何ですか?
Node.jsアーキテクチャの内部について詳しく調べていますが、よく出てくる用語は「イベントループの次のティック」や関数nextTick()のように「ティック」です。 私が見たことがないのは、正確に「カチカチ」が何であるかについての確かな定義です。さまざまな記事(この記事など)に基づいて、頭の中で概念をまとめることができましたが、それがどれほど正確かはわかりません。 Node.jsイベントループティックの正確で詳細な説明を取得できますか?

5
+ =の非同期関数
let x = 0; async function test() { x += await 5; console.log('x :', x); } test(); x += 1; console.log('x :', x); コードスニペットを実行する結果を非表示スニペットを展開 xログに記録される値は1および5です。私の質問は次のとおりです:なぜx 52番目のログの値は何ですか? が(非同期関数であるため)のtest後に実行された場合、x += 1xの値testは実行されるまでに1になるx += await 5ため、の値を作成する必要がありますx 6。

2
ブラウザーがネイティブPromiseをサポートしていない場合、マイクロタスクをキューに入れる方法は?
即時のコールバックのタイミングに依存しないコード(マイクロタスクとマクロタスクのような)を書く方が良いですが、とりあえず脇に置いておきましょう。 setTimeoutマクロタスクをキューに入れます。マクロタスクは、少なくとも、すべてのマイクロタスク(およびそれらが生成するマイクロタスク)が完了するまで開始を待機します。次に例を示します。 console.log('Macrotask queued'); setTimeout(function() { console.log('Macrotask running'); }); Promise.resolve() .then(function() { console.log('Microtask running'); }); console.log('Microtask queued'); console.log('Last line of script'); コードスニペットを実行する結果を非表示スニペットを展開 行動.then解決の約束には、即時の行動は基本的に異なるsetTimeoutコールバック-約束は.thenしても、最初に実行されるsetTimeout最初のキューに入れられました。ただし、Promiseをサポートしているのは最新のブラウザのみです。どのようにすることができ、特別な場合にはマイクロタスクの機能が適切にpolyfilledことPromiseは存在しないのですか? .thenを使用してのマイクロsetTimeoutタスクを模倣しようとすると、マイクロタスクではなくマクロタスクがキューイングされるため、.thenマクロタスクがすでにキューに登録されている場合、不適切にポリフィルされたものが適切なタイミングで実行されません。 を使用した解決策がありますMutationObserverが、見た目が醜く、それMutationObserverが目的ではありません。また、MutationObserverIE10以前ではサポートされていません。Promiseをネイティブでサポートしていない環境でマイクロタスクをキューに入れたい場合、より良い代替手段はありますか? (私は実際にはIE10をサポートしようとしているわけではありません。これは、Promiseなしでマイクロタスクをキューに入れる方法についての理論的な演習です)

1
1,000個のHTTPリクエストの並列トリガーがスタックする
問題は、1kから2kの発信HTTPリクエストをトリガーしたときに実際に何が起こっているかです。500接続ですべての接続を簡単に解決できることがわかりますが、そこから上に移動すると、接続が開いたままになり、ノードアプリがスタックしたままになるため、問題が発生するようです。ローカルサーバー+ Googleの例およびその他の模擬サーバーでテスト済み。 そのため、いくつかの異なるサーバーエンドポイントで理由を受け取りました。サーバーが要求を処理できず、エラーをスローして問題ないECONNRESETを読み取りました。1kから2kの要求範囲では、プログラムはハングします。開いている接続を確認すると、lsof -r 2 -i -aそこにぶら下がっている接続がX量あることがわかります0t0 TCP 192.168.0.20:54831->lk-in-f100.1e100.net:https (ESTABLISHED)。リクエストにタイムアウト設定を追加すると、タイムアウトエラーが発生する可能性がありますが、それ以外の場合は、接続が永久に維持され、メインプログラムがリンボ状態になります。 コード例: import fetch from 'node-fetch'; (async () => { const promises = Array(1000).fill(1).map(async (_value, index) => { const url = 'https://google.com'; const response = await fetch(url, { // timeout: 15e3, // headers: { Connection: 'keep-alive' } }); if (response.statusText !== …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.