Как я могу синхронизировать код JavaScript, который зависит от ответа на несколько запросов AJAX? - PullRequest
0 голосов
/ 20 мая 2011

Обычно я бы использовал функцию обратного вызова, переданную функции 'jQuery.getJSON', чтобы сделать что-то после ответа сервера. В этом случае я применил обработчики событий к некоторым элементам ввода, но эти обработчики должны выполняться только после успешного выполнения нескольких запросов ajax. По сути, мне нужно приостановить выполнение обработчика событий до тех пор, пока ожидаемые данные не станут доступными.

В многопоточных языках я бы делал это, используя мьютексы / семафоры, но, поскольку javascript является однопоточным, мне интересно, возможно ли что-то подобное.

Ответы [ 3 ]

1 голос
/ 20 мая 2011

Один из ручных способов сделать это - поставить в очередь ваши вызовы AJAX в массиве, а затем подсчитать количество полученных вами ответов и подождать, пока это количество не совпадет с размером вашей исходной очереди (или, альтернативно, выдвинуть Вызов из очереди, когда ответ сделан, и вы знаете, что у вас есть все, когда очередь имеет размер 0).

Вам необходимо проверить, готовы ли вы продолжить вызов setTimeout.

Кроме того, вы можете проверить отложенную поддержку в jQuery 1.5 +

РЕДАКТИРОВАТЬ: быстрый и грязный пример ручного подхода:

var remoteCallA = function(){
    $.getJSON('someurl', function(){
        success++;
    });
};

var remoteCallB = function(){ 
    // etc
};

var whenAllDone = function(){
    // do something when everything is done
};

var checkAllDone = function(){
    if(success === remoteCalls.length){
        whenAllDone();
    } 
    else{ 
        setTimeout(checkAllDone, 1000);
    }
};

var remoteCalls = [remoteCallA, remoteCallB];
var success = 0;
for(var i = 0, length = remoteCalls.length; i++){
    remoteCalls[i]();
}

checkAllDone();
1 голос
/ 20 мая 2011

Я могу дать вам грязное решение. Создайте функцию, которую хотите выполнить, как только все запросы вернутся. Создайте еще одну функцию для отправки. Так же, как семафор / мьютекс, создайте переменную синхронизации. Увеличивайте переменную для каждого из вызовов. Затем в диспетчерской функции уменьшите значение переменной и, если оно равно нулю, выполните нужную функцию. Примените функцию отправки в качестве обработчика события для возврата ajax (если у вас уже есть обработчики, которые не хотят приостановить, поместите их в конец каждого существующего обработчика).

Тогда придумайте более элегантное решение.

1 голос
/ 20 мая 2011

javascript основан на событиях, поэтому один из подходов - генерировать событие каждый раз, когда скоординированный xhr получает ответ.Обработчик событий отслеживает ответы и работает только тогда, когда все возвращаются.

Или вы можете сделать то же самое без событий, просто вызвав метод напрямую и согласовав ответы там ....

...