Один обратный вызов для нескольких запросов JSON - PullRequest
2 голосов
/ 06 июня 2009

Я хочу сделать X количество запросов ajax в jQuery и добавить ответ json в массив. Когда все запросы Ajax выполнены, я хотел бы выполнить некоторый код. Есть хороший способ решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 06 июня 2009

Я не знаю другого способа, кроме подсчета запросов и подсчета их вручную в вашем коде. Как только они вернутся и будут учтены, выполните ваш главный обратный вызов.

1 голос
/ 06 июня 2009

Этот код должен делать то, что вы хотите, все в стиле jQuery. В основном это использует немного рекурсии, чтобы сделать это. Передайте параметры в функцию loadmultiples, чтобы установить, что вы хотите сделать, и ответы JSON помещаются в массив. Вы можете легко изменить его, если хотите вместо этого объединить ответы JSON в одну структуру, но я не был уверен, что это именно то, что вы хотели.

var loadmultiples = function(options) {    

    var settings = $.extend({

        //set the url to get
        url : '/response.json',

        //this function is called when everything is done
        callback : function() {},

        //set this option to define how many loads to do
        numbertodo : 10,

        //these two are just used for
        //storing data while we recurse,
        //and keeping track of the current position
        //however you can change them if you want to start
        //from a different point, or have existing data
        numberdone : 0,
        data : []
    }, options || {});

    //load the json, passing up the current 'number'
    //of the content to load
    $.ajax({
        url : settings.url,
        data : { 'number' : settings.numberdone },
        dataType: 'json',        
        success: function(result) {            

            //add the response to the data
            settings.data.push(result);

            //increment the counter of how many files have been done
            settings.numberdone++;

            //
            if(settings.numberdone < settings.numbertoexecute) {
                loadmultiples(settings);
            } else {
                settings.callback(settings.data);
            }

        }        
    });

}

//so now we can call it...
loadmultiples({
    callback: function(data) {
        //this function will get called when all the data calls have been
        //completed, and the resulting data is in the data parameter

    }
});
0 голосов
/ 06 июня 2009

Я сделал это недавно, запустив кучу ajax-запросов, затем уменьшив счетчик по мере их поступления.

Это работало нормально, но я закончил тем, что изменил свой код с нескольких небольших запросов ajax на простой запрос всего сразу за сервером. Намного меньше запросов и меньше накладных расходов, и намного более надежный.

Если у вас нет веских оснований для выполнения отдельных запросов (некоторые запросы могут быть быстрыми, а некоторые медленными, и вы можете предложить некоторое осмысленное отображение информации по мере поступления фрагментов), я бы объединил их все вместе (если Вы можете изменить код сервера или добавить новый код сервера).

0 голосов
/ 06 июня 2009

Для каждого ответа ajax я бы сделал:

for(var k in json)
  someArray[k]=json[k];

Но я не уверен, как выглядят ваши данные JSON.

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