5

次のコードを見てください。どのログが最初に出力されると思いますか?
Chrome と IE では、予想どおり「sync ajax call: success」が最初に表示されますが
、FF (FF 3.6 および FF 17.0 でテスト済み) では、代わりに「async ajax call: success」が最初に表示
されます。 2 つ目は同期呼び出しですが、その onreadystatechange がトリガーされたときに、非同期 (最初) の ajax 呼び出しのハンドラーが同期 (2 番目) の ajax 呼び出しよりも早く実行されましたが、意味がありますか?
firefoxのバグじゃないの?

// first ajax call, Note: this is asynchronous.
$.ajax({
    url: "/rest/someUrl",
    async : true,
    dataType : "json",
    contentType: "application/json",
    success : function(data) {
        console.log("async ajax call: success");
    },
    error : function(data) {
    }
})
// second ajax call, Note: this is synchronous.
$.ajax({
    url: "/rest/someUrl",
    async : false,
    dataType : "json",
    contentType: "application/json",
    success : function(data) {
        console.log("sync ajax call: success");
    },
    error : function(data) {
    }
})
4

1 に答える 1

5

何かを「正しく」実装するには、何らかの仕様が必要です。

仕様内では、同期要求が終了しない限り、すべてのスクリプトの実行を停止する必要があるという事実への参照は見つかりませんでした (同期 XHR の開始時に非同期 XHR が既に実行されていることに注意してください)。

しかし、私はこれを見つけました:

  1. 各 XMLHttpRequest オブジェクトには、独自のタスク ソースがあります。つまり、XMLHttpRequest タスク ソースです。
    --両方のリクエストが単一のタスク ソースを表します--

  2. ユーザー エージェントがタスクをキューに入れる場合、指定されたタスクを関連するイベント ループのタスク キューの 1 つに追加する必要があります。[...] 異なるタスク ソースからのタスクは、異なるタスク キューに配置される場合があります。
    --両方のタスクを同じタスク キューに追加できますが、追加してはなりません--

  3. イベント ループは、それが存在する限り、次の手順を実行し続ける必要があります
    。ユーザー エージェントは、任意のタスク キューを選択できます。

    --ここで、同期リクエストを配置するタスク キューを選択します。

私がこれを誤解しておらず、私の論理が間違っていない場合、これは起こっている可能性があります:

Firefox は両方の XHR を同じキューに置き、IE と chrome はそれらを異なるタスクキューに置きます。

すべてのブラウザーは、同期 XHR を配置したタスク キューを実行するようになりました。

  • IE と chrome では、同期 XHR がキュー内の最も古いタスクであり、実行されます
  • FF では、非同期 XHR がキュー内で最も古く、実行されます。

どちらの実装も正しいようです。

于 2013-01-11T08:35:18.633 に答える