JavaScriptのコールバックがどのように機能するのでしょうか。私は具体的に非同期XmlHttpRequest
の仕組みを理解できません。どのようにJSは、サーバーが(1つのスレッドで)いくつかの値を返したと判断し、コールバックメソッドを呼び出すことができますか?それはタイマで構築されていますか?JSがコールバック関数を呼び出すタイミングを決定する方法
答えて
非常によく似た質問がhereとさらに詳細に回答されました。
基本的な答えは、着信ネットワークパケットが到着したときにスレッドまたは通知の種類が存在するOSレベルで、基礎となるネットワークが発生していることです。結果が完了すると、イベントがjavascriptイベントキューに追加されます。そのイベントがイベントキューの先頭に到達し、javascriptが動作する準備ができたら、適切なjavascript ajaxイベントがトリガされ、コールバックを呼び出すJavaScriptのチェーンが開始されます。
タイムアウトに時間がかかることがありますが、タイマーはajax応答がいつ到着したかを知るために使用されません。これは、ブラウザが使用するOSレベルのネットワークサポートに基づいています。
comlitely回答ありがとうございますが、このイベントはOSレベル(OS通知JSイベントキューの前)に登録されていますか?彼らは、ブラウザの新しいページが開いた後に実行されるスレッドに登録されていますか? – MyTitle
@Hello - 申し訳ありませんが、私はあなたの質問を理解していません。 javascriptエンジンは、ネイティブOSレベルのコードで実装されています。実装では、ネットワーキングにOSレベルの機能をすべて使用することは自由です。ブロッキングスレッド、ソケット通知などを使用することができます。 – jfriend00
あなたは他の質問で答えました:「Ajax応答が行われると、いくつかのネイティブコードが完了し、イベントをJSキューに入れることがわかります。しかし、ネイティブコードが登録されたイベントに関する情報を保持する場所はどこですか? – MyTitle
タイマーは、トリガーするタイミングを特定できないため使用できません。
私はそれが何らかのスタック/キュー[リストまたはテーブル]を使用して、呼び出しを追跡し、返された情報に応じて応答機能をポップして、応答している要求を伝えていると思います。
JavaScriptは環境内で動作します。その環境はシングルスレッドではありません。 xhrがブラウザを返すと(環境)、xhrが返されたことをjavascriptエンジンに通知し、それがコールバックを実行します。また、ユーザーのためのjavascriptのプログラミングモデルがシングルスレッドであっても、javascript自体はそうである必要はありません。現時点でを実行一切のjavascriptがありませんたび
ありがとうございます。しかし、これを理解するには: "ユーザーのためのJavaScriptのプログラミングモデルがシングルスレッドであっても、javascript自体はそうである必要はありません。" JS自体はどのようにマルチスレッド化できますか?それは本質的にsinglethreaded場合 – MyTitle
は、2つの部分がjavascriptにあります。あなたが使っている部分であり、スレッディングは公開されていません。次に、あなたのコードを実行するjavascriptインタプリタがあります。その部分はねじ切りすることができます。 – hvgotcodes
は、基本的には...
、XmlHttpRequestのにのsetTimeoutと回答からトリガイベントがチェックされます。実際にはイベントキューに追加されます。
この興味深い効果は、javascriptが(現在)が実行されている限り、これらのようなイベントは決して引き起こされないということです。
XmlHttpRequest
の非同期性は、(ブラウザによって)javascriptよりも低いレベルで提供されます。コールバック関数は、要求が完了したjavascriptエンジンへのブラウザのシグナリングによって開始されます。
hm ...言い換えれば、このイベント(xhrコールバック、タイマーコールバック、マウスリスナーなど)は、ブラウザのキューやブラウザのシグナルにJSエンジンに組み込まれています。 – MyTitle
- 1. OnClickイベントがjs関数とコールバック関数を呼び出す
- 2. JSコールバックでjqueryプラグイン関数を呼び出す
- 3. PhantomJS onLoadFinishedコールバック関数を呼び出す
- 4. Icefacesでjs関数を呼び出す
- 5. HTMLでJS関数を呼び出す方法
- 6. 動的に任意のjs関数を呼び出す方法
- 7. 別のJSファイルからJavascript関数を呼び出す方法
- 8. .jsファイルのコードビハインドで関数/メソッドを呼び出す方法は?
- 9. イベントなしでjs関数を呼び出す方法
- 10. 10秒ごとにJS関数を呼び出す方法
- 11. data.tableを呼び出す関数を呼び出す関数の記述方法?
- 12. ファイル呼び出し関数のディレクトリレベルを決定する
- 13. ViewModel.LoadDataを呼び出すタイミング
- 14. obtainPermanentIDsForObjectsを呼び出すタイミング:
- 15. Jquery:すべてのajaxコールでコールバック関数を呼び出す方法
- 16. アクションスクリプトファイルから.jsファイル内のJs関数を呼び出す
- 17. 真の呼び出しアセンブリを決定する方法
- 18. ラムダ.NETでユーザ定義関数を呼び出す方法
- 19. 定義された関数を呼び出す方法は? (Javascript)
- 20. document.ready関数で関数を呼び出す方法をJquery
- 21. JS Jqueryネームスペース関数の呼び出し
- 22. JSの関数呼び出しイベント?
- 23. js-ctypesでポインタを使用して関数を呼び出す方法
- 24. JSで別の関数を呼び出すのを防ぐ方法は?
- 25. onblur ajaxがコールバック関数を呼び出さない
- 26. 目的関数CでJavaScript関数を呼び出す方法
- 27. ワークフロー内の関数から関数を呼び出す方法
- 28. 別の関数で関数を呼び出す方法は?
- 29. jquery関数からphp関数を呼び出す方法
- 30. ユーザー定義関数imacacsで関数を呼び出す方法は?
これに近いです:http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 – jfriend00