jQuery - объединяет результаты неизвестного числа запросов Ajax - PullRequest
1 голос
/ 05 февраля 2012

Это может быть либо очень просто, либо довольно сложно, на данный момент я не уверен.

Я пишу небольшое веб-приложение, которое будет создавать расписание кинотеатров на основе API Cineworld.

Я извлекаю данные с помощью AJAX, и это нормально, но я дошел до того, что хочу получить все время для всех выбранных фильмов, а затем перейти к манипулированию ими позже, но объединяя все результаты - это небольшая проблема.

Получившийся API-вызов может быть выполнен только для одного фильма, поэтому мне по очереди нужно извлечь данные для каждого фильма.

Текущее, очень раннее состояние приложения вы можете увидеть здесь: http://www.lewishowles.co.uk/film/

И основные силы в этом файле: http://www.lewishowles.co.uk/film/js/lh.js

Линии 42 и 206 - мои проблемы. 42 всегда записывает пустой массив, но если я каждый раз записываю массив на 206, это нормально. Регистрация, очевидно, не очень мне поможет. Похоже, что логин 42 не ждет завершения всего кода в функциях над ним.

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

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

Установка асинхронного на ложное останавливало их срабатывание друг на друга, но это не помогло в этой ситуации.

Две вещи, о которых я могу думать, это использование Session Storage или сокрытие результатов каждого цикла в HTML где-нибудь, к которому мне потом придется обращаться позже, но оба из них, похоже, будут подвержены одним и тем же проблемам.

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Если вы хотите запустить несколько вызовов ajax, а затем узнать, когда они завершены, есть несколько способов сделать это.

Самый простой способ - просто сохранить счетчик количестваАякс звонки в полете.Затем, когда каждый из них завершается, вы уменьшаете счетчик (в обработчике успеха) и, если счетчик обнуляется, вы вызываете функцию, которую хотите выполнить, когда все данные доступны.

В псевдокод, это может работать так для асинхронных вызовов AJAX:

function runAjaxRequests(listOfRequests) {
    var ajaxCntr = listOfRequests.length;
    var ajaxResults = [];

    // fire off all the ajax requests
    for (var i = 0; i < listOfRequests.length; i++) {
        $.ajax(..., function(data) {
            // ajax success handler

            // store data returned from this request into ajaxResults
            ajaxResults.push(...);

            // see if all ajax requests are now done
            --ajaxCntr;
            if (ajaxCntr == 0) {
                // all data has been returned, we can process it now
                processAllAjaxData(ajaxResults);
            }
        })
    }
}
0 голосов
/ 06 февраля 2016

У меня был похожий вариант использования. И я достиг этого, сделав async:false и добавив каждый результат в родительскую переменную. Проверьте ниже код.

            fileArr = ['1.csv', '2.csv']
            var csvObjArr = []
            for (var i in fileArr) {
                $.ajax({
                    type : "GET",
                    url : _default_base_dir + fileArr[i],
                    dataType : "text",
                    async: false,
                    success : function(data) {
                        // Appending every results in csvObjArr
                        csvObjArr = csvObjArr.concat($.csv.toObjects(data));
                    }
                }); 
            }
            //At this point all ajax are completed
            processData(csvObjArr)

ПРЕДУПРЕЖДЕНИЕ Этот код будет вызывать ajax один за другим. Вы должны принять это во внимание, поскольку это может замедлить ненужные вещи. НТН

...