Я пытаюсь реализовать интерфейс iGoogle как интерфейс панели управления, используя виджеты, которые получают свой контент с других сайтов, используя вызовы JSONP.порядок выполнения обратного вызова в jQuery getJSON
Проблема в том, что если первый виджет, который вызывает «$ .ajax», занимает 8 секунд, чтобы вернуть содержимое, кажется, что обратные вызовы других виджетов будут вызываться только после того, как обратный вызов первого виджета получит казнены. Для удобства пользователей было бы лучше, если бы виджеты могли отображаться, как только они вернут содержимое с удаленных сайтов, и не дожидаться тех, которые были запланированы до завершения.
Есть ли способ, которым я могу это сделать?
EDIT: Я использую jquery 1.4.1.
Я тестировал Chrome, и поведение, похоже, отличается от поведения в Firefox.
Вот скрипт, который я сделал, чтобы попытаться получить то, что происходит:
function showTime(add) { console.log(getTime() + ': ' + add); }
function getNow() { return new Date().getTime(); }
initialTime = getNow();
function getTime() { return getNow() - initialTime; }
function display(data) { showTime('received a response'); }
showTime("Launched a request");
jQuery.getJSON("http://localhost:51223/WaitXSeconds/3?callback=?", display);
showTime("Launched a request");
jQuery.getJSON("http://localhost:51223/WaitXSeconds/4?callback=?", display);
showTime("Launched a request");
jQuery.getJSON("http://localhost:63372/WaitXSeconds/9?callback=?", display);
showTime("Launched a request");
jQuery.getJSON("http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javascript&callback=?", display);
showTime("Launched a request");
jQuery.getJSON("http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?", display);
Первые три вызова просто поддельные вызовы, ожидающие заданное количество секунд. Обратите внимание, что я использую два разных сервера, реализующих этот метод.
Вот результат в консоли на Firefox 3.6.2:
0: Launched a request
3: Launched a request
6: Launched a request
11: Launched a request
14: Launched a request
3027: received a response
7096: received a response
9034: received a response
9037: received a response
9039: received a response
.. и вот результат в Chrome 4.1.249.1036 (41514):
1: Launched a request
2: Launched a request
3: Launched a request
4: Launched a request
5: Launched a request
165: received a response
642: received a response
3145: received a response
7587: received a response
9157: received a response
Кажется, что в Firefox, два запроса к двум общедоступным API-адресам вызывают в конце, после того, как все остальные вызовы будут успешными.
Хром, с другой стороны, может выполнить обратный вызов, как только он получит ответ.
В обоих браузерах, когда запрос выполняется на том же сервере, они не выполняются параллельно. Они назначаются один за другим. Но я думаю, что это разумное поведение.
Может кто-нибудь объяснить поведение Firefox или есть какие-то взломы, чтобы обойти это?
Это не звучит для меня. Порядок выполнения вызовов не должен влиять на порядок, в котором они возвращаются ... – Skilldrick
Вы заставляете эти вызовы быть синхронными? –
Какой браузер вы используете? Вы видите одно и то же поведение в разных браузерах? –