jQuery Async Вызывать только «параллельно», когда URL разные - PullRequest
0 голосов
/ 18 августа 2011

Прошлой ночью я играл с jQuery и асинхронными вызовами и обнаружил необычную проблему.Я хотел выполнить несколько вызовов Ajax внутри цикла.Я написал ниже (где rand.php просто спит на секунду и возвращает случайное число).Несколько удивительно, что он выполняется синхронно и занимает около 20 секунд.

$(document).ready(function () {
    $([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]).each(function() {
        var number = this;

        $.get("rand.php", function(data) {
            $('#'+number).html(data);
        });
    });
});

Код PHP выглядит следующим образом:

<?php
sleep(1);
echo rand(); 
?>

Я думал, что это явно неправильно, поскольку асинхронные вызовыНе должно быть никаких блокировок и возврат почти параллельно.После долгих тренировок (предполагая, что это проблема с сервером), я обнаружил, что добавление чего-либо к URL-адресу, чтобы он выглядел иначе, работало, как и ожидалось.То есть он возвращается через 3 секунды или около того (6 или около того вызовов одновременно).

$(document).ready(function () {
    $([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]).each(function() {
        var number = this;

        $.get("rand.php?"+number, function(data) {
            $('#'+number).html(data);
        });
    });
});

Я не думаю, что гуру jQuery / Javascript может объяснить это поведение?Это какое-то ограничение браузера?Почему только когда URL-адреса отличаются, он работает так, как я ожидал?

РЕДАКТИРОВАТЬ - Вместо того, чтобы отвечать, он использовал Chrome (каким бы он ни был последним) и Firefox 5 /6.Я попробовал это в IE, который кешировал его, поэтому проигнорировал это и сосредоточился на Chrome.Интересно, что первый работает, как и ожидалось, в IE9 при загрузке первой страницы, но затем просто отображает кэшированные результаты при перезагрузке.

1 Ответ

0 голосов
/ 18 августа 2011

Вы находитесь в т. Е. Не так ли. Плохой! Плохой пользователь IE! IE кеширует запросы, как если бы это был какой-то другой контент. Jquery имеет встроенную функцию для решения этой проблемы:

$.ajaxSetup({ cache : false });

Это добавит отличный спойлер, чтобы позаботиться об этом. Но зачем добавлять спойлер в другие браузеры? Обычно я делаю это:

if(!+"\v1"){
    $.ajaxSetup({ cache : false });
}

Что такое тесты для IE и установить его только в этом браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...