Вы не можете комбинировать синхронный цикл for
с асинхронными операциями и заставить вещи правильно упорядочиваться, потому что нет никакого способа сделать цикл for
«ожидающим» для обещания закончить. Цикл for
работает синхронно, поэтому он сразу запускает все операции async.
Итак, вместо этого вы должны выполнить свои итерации другим способом. Если бы вы повторяли только один параметр, было бы много готовых способов сделать это, но я не знаю никаких готовых решений для итерации трех вложенных переменных, поэтому вам придется создавать свои собственные. Вот один из способов сделать это. Этот метод является специально кодируются для итераций, что делает его немного меньше кода, что общая схема:
// fn gets called like this fn(i, j, k) and must return a promise
function iterateLevels(fn) {
var i = 1, iMax = 3;
var j = 1, jMax = 5;
var k = 1, kMax = 6;
function next() {
if (k > kMax) {
j++;
k = 1;
}
if (j > jMax) {
i++;
j = 1;
}
if (i > iMax) {
return;
}
return fn(i, j, k).then(function(result) {
k++;
// process result here
// if you want to continue processing, then
return next();
});
}
return next();
}
Вот рабочий пример реализации с использованием обещание со случайной задержкой: https://jsfiddle.net/jfriend00/q2Lnhszt/
next()
функция с внешние переменные диапазона i
, j
и k
- это, по сути, конечный автомат, где каждый раз, когда вы вызываете next()
, он запускает следующую итерацию и обновляет ее состояние.
Это может быть сделано общим, поэтому вы передаете, сколько уровней итераций и каковы значения начала и завершения для каждого уровня, и вы можете передать функцию для обработки результата. Создание его generic добавляет больше кода в реализацию и делает логику немного сложнее следовать.
не только это настолько расплывчато, что на него невозможно ответить, он также ошибочен. Обещания - асинхронные, для циклов - нет. вы не можете просто «ждать» обещания решить. – Claies
Пожалуйста, сделайте [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – user3078414
@Claise: да, я использовал неправильные слова здесь, sry. jfriend00 объясняется в ответах ниже, что моя проблема: – El53