Как запустить цепочку обещание-потом, используя карту или уменьшить произвольное количество элементов цепочки?
Я застрял на следующем:
Скрипт возвращает произвольное число n
или массив, как это:
[["a"], ["b"], ["c"], ["d"]]
Мне нужно перебрать массивы, используя обещание then()
, но так как я не знаю, сколько элементов будет, я закончил тем, что сделал это:
var bundle_list = [["a"], ["b"], ["c"], ["d"]];
var x = bundle_list.reduce(function(current, next) {
console.log(current);
// requestBundle will also return a promise
return requestBundle(current)
.then(function(bundle_response) {
// do foo
console.log("CALLING NEXT")
console.log(next);
return RSVP.resolve(next);
});
})
x.then(function(last_response) {
return console.log("DONE")
});
Моя проблема в том, что мой reduce/map
оба запускают все итерации до запуска моего асинхронного кода, поэтому я получаю 3x current
консоль сопровождается done
приставка. Таким образом, все мои "петли" на карте запускаются мгновенно, а результаты (чуть позже) синхронизируются...
Я использую эту реализацию RSVP, но это A+, поэтому не должно быть проблемой. Я пытался найти ответ, приведенный здесь, но не могу заставить его работать должным образом.
Вопрос:
Можно ли создать "тогдашнюю цепь" с произвольным числом then
заявления. Если так, некоторые указатели приветствуются!
Спасибо!
1 ответ
Цикл for (или forEach) должен выполнять:
var queue = RSVP.Promise.resolve(); // in ES6 or BB, just Promise.resolve();
bundle_list.forEach(function(el){
queue = queue.then(function(res){
console.log("Calling async func for", el);
return requestBundle(el);
});
});
queue.then(function(lastResponse){
console.log("Done!");
});