Цепное выполнение массива обещаний в javascript - PullRequest
0 голосов
/ 26 марта 2020

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

const syncStatusChanges = () => {
    return new Promise((resolve, reject) => {
        console.log("in")

        setTimeout(() => {
            console.log("done")
            resolve({ done: true })
        }, 2000);
    });
}


const run = () => {
  const promises = [syncStatusChanges(), syncStatusChanges()]
  promises[0].then(res => {
      console.log("done 1")
      promises[1].then(res => {
          console.log("done 2")
      })
  })
}

run()

В этом примере вывод:

in
in
done
done 1
done
done 2

Но я хочу, чтобы это было:

in
done
done 1
in
done
done 2

Я также хочу это работать для любого числа функций. Я видел этот ответ, но результат тот же!

var promise = statusChangeCalls[0];
for (var i = 1; i < statusChangeCalls.length; i++)
    promise = promise.then(statusChangeCalls[i]);

1 Ответ

0 голосов
/ 26 марта 2020

Как написано в комментариях. Вы выполняете функции в самом массиве. Что я понял, увидев ваш вывод. Функция ниже запуска может помочь вам.

  const run = () => {
  const promise = syncStatusChanges();
  promise.then(res => {
     console.log("done 1")
     syncStatusChanges().then(res => {
         console.log("done 2")
     })
  })
}

Обещание выполняется с нетерпением. Он не ждет, чтобы зарегистрировать функцию then. Вы можете искать наблюдаемые , они ленивы в исполнении. В основном они ждут, пока вы их не подпишете.

За ваше второе сомнение по поводу l oop. Вы можете использовать ключевое слово asyn c await для создания цепочки. Просто передайте число в качестве параметра в функции runInL oop, чтобы выполнить обещание столько раз.

const runInLoop = async(numberOfPromisesCall)=> {
  for (let i = 0; i < numberOfPromisesCall; i++){
       await syncStatusChanges();
       console.log(`done ${i + 1}`);
  }
} 
runInLoop(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...