Как запустить цепочку обещание-потом, используя карту или уменьшить произвольное количество элементов цепочки?

Я застрял на следующем:

Скрипт возвращает произвольное число 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!");
});
Другие вопросы по тегам