Как сохранить порядок $ .getJSON в порядке? - PullRequest
0 голосов
/ 25 января 2019

По сути, у меня есть цикл for, который запрашивает данные json

for(var i=0; i<x; i++){
    //does stuff
    $.getJSON(link, function(data){
        // does stuff
        arr.push(file);
    }
}

. Это позволит расположить файлы в произвольном порядке, поскольку getJSON является асинхронным.

Так что мне было интересно, как лучше сохранить файлы в порядке или проиндексировать их, чтобы потом можно было их отсортировать?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете заключить вызов AJAX в новое замыкание, чтобы сохранить переменную i, и использовать индексную сигнатуру сеттера вашего массива.

var arr = [];

for (var i=0; i<x; i++){  
    //does stuff
    (function(index) {
        $.getJSON(link, function(data){
            // does stuff
            arr[index] = data;
        }
    })(i);
}

Обратите внимание, что если вы используете EcmaScript 6, вы можете использовать ключевое слово let в цикле for, чтобы иметь вид переменной local i, так что вы не не нужно закрытие.

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

Обратите внимание, что я не тестировал этот код, он может содержать ошибки, и он только для демонстрационных целей.

0 голосов
/ 25 января 2019

Поместите обещания, возвращаемые getJSON, в массив, а затем обработайте результаты обещания.

Таким образом, "делает вещи" не будет, пока все запросы не будут завершены, и массив обещаний преобразуется в массив со всеми данными в правильном порядке.

let promises = [];

for (var i = 0; i < x; i++) {
  promises.push($.getJSON(link));
}

Promise.all(promises).then(results => results.forEach(do_stuff_here));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...