2012-01-12 9 views
1

JavaScriptのコールバックがどのように機能するのでしょうか。私は具体的に非同期XmlHttpRequestの仕組みを理解できません。どのようにJSは、サーバーが(1つのスレッドで)いくつかの値を返したと判断し、コールバックメソッドを呼び出すことができますか?それはタイマで構築されていますか?JSがコールバック関数を呼び出すタイミングを決定する方法

+0

これに近いです:http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 – jfriend00

答えて

2

非常によく似た質問がhereとさらに詳細に回答されました。

基本的な答えは、着信ネットワークパケットが到着したときにスレッドまたは通知の種類が存在するOSレベルで、基礎となるネットワークが発生していることです。結果が完了すると、イベントがjavascriptイベントキューに追加されます。そのイベントがイベントキューの先頭に到達し、javascriptが動作する準備ができたら、適切なjavascript ajaxイベントがトリガされ、コールバックを呼び出すJavaScriptのチェーンが開始されます。

タイムアウトに時間がかかることがありますが、タイマーはajax応答がいつ到着したかを知るために使用されません。これは、ブラウザが使用するOSレベルのネットワークサポートに基づいています。

+0

comlitely回答ありがとうございますが、このイベントはOSレベル(OS通知JSイベントキューの前)に登録されていますか?彼らは、ブラウザの新しいページが開いた後に実行されるスレッドに登録されていますか? – MyTitle

+0

@Hello - 申し訳ありませんが、私はあなたの質問を理解していません。 javascriptエンジンは、ネイティブOSレベルのコードで実装されています。実装では、ネットワーキングにOSレベルの機能をすべて使用することは自由です。ブロッキングスレッド、ソケット通知などを使用することができます。 – jfriend00

+0

あなたは他の質問で答えました:「Ajax応答が行われると、いくつかのネイティブコードが完了し、イベントをJSキューに入れることがわかります。しかし、ネイティブコードが登録されたイベントに関する情報を保持する場所はどこですか? – MyTitle

1

タイマーは、トリガーするタイミングを特定できないため使用できません。

私はそれが何らかのスタック/キュー[リストまたはテーブル]を使用して、呼び出しを追跡し、返された情報に応じて応答機能をポップして、応答している要求を伝えていると思います。

1

JavaScriptは環境内で動作します。その環境はシングルスレッドではありません。 xhrがブラウザを返すと(環境)、xhrが返されたことをjavascriptエンジンに通知し、それがコールバックを実行します。また、ユーザーのためのjavascriptのプログラミングモデルがシングルスレッドであっても、javascript自体はそうである必要はありません。現時点でを実行一切のjavascriptがありませんたび

+0

ありがとうございます。しかし、これを理解するには: "ユーザーのためのJavaScriptのプログラミングモデルがシングルスレッドであっても、javascript自体はそうである必要はありません。" JS自体はどのようにマルチスレッド化できますか?それは本質的にsinglethreaded場合 – MyTitle

+0

は、2つの部分がjavascriptにあります。あなたが使っている部分であり、スレッディングは公開されていません。次に、あなたのコードを実行するjavascriptインタプリタがあります。その部分はねじ切りすることができます。 – hvgotcodes

1

は、基本的には...

、XmlHttpRequestのにのsetTimeoutと回答からトリガイベントがチェックされます。実際にはイベントキューに追加されます。

この興味深い効果は、javascriptが(現在)が実行されている限り、これらのようなイベントは決して引き起こされないということです。

1

XmlHttpRequestの非同期性は、(ブラウザによって)javascriptよりも低いレベルで提供されます。コールバック関数は、要求が完了したjavascriptエンジンへのブラウザのシグナリングによって開始されます。

+0

hm ...言い換えれば、このイベント(xhrコールバック、タイマーコールバック、マウスリスナーなど)は、ブラウザのキューやブラウザのシグナルにJSエンジンに組み込まれています。 – MyTitle

関連する問題