Выполнить массив обещаний последовательно, не используя async / await - PullRequest
6 голосов
/ 25 апреля 2019

Допустим, у меня есть множество обещаний.Каждый элемент моего массива является построителем запросов knex.js и готов к выполнению и возвращает обещание.

Как я могу запустить каждый элемент этого массива последовательно.Массив создается динамически.

let promisesArray = [q1,q2,q3] ;

Каждый q не является обещанием само по себе, но при выполнении оно возвращает обещание.

Ответы [ 5 ]

5 голосов
/ 25 апреля 2019

Здесь может быть возможный вариант:

let p = Promise.resolve([]);
promisesArray.forEach(q => {
  p = p.then(responses => {
    //based on the nature of each q, to start execution
    //use either q().then() or q.then()
    return q().then(response => {
      //Any further logic can be here.
      console.log(response);
      return responses.concat([response]);
    })
  })
})

p.then(responses => {
  // here you have all of the responses.
})
0 голосов
/ 27 мая 2019

Вы можете использовать Promise.map с параллелизмом, установленным на 1.

await Promise.map(arrayOfObj, async (obj) => {
    await this.someOperation();
  },
  {concurrency: 1}
);
0 голосов
/ 25 апреля 2019

На основании вашего заявления о том, что q1, q2, q3 являются "построителем запросов knex.js и готовы к выполнению и возвращают обещание", получите функцию, которая будет выполняться сама со следующим индексом, когда обещание будет выполнено. Сначала позвоните с 0.

function awaitPromise(arr, idx) {

   arr[idx]().then(function(res) {

       console.log(res);

       if (idx < arr.length - 1)      
           awaitPromise(arr, idx + 1);
   })
}
0 голосов
/ 25 апреля 2019

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

    var Promise = require("bluebird");
    Promise.map([q1,q2,q3], {concurrency: 1})
0 голосов
/ 25 апреля 2019

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

let promisesArray = [q1,q2,q3] ;

function runSequentially(promiseArr) {
  return promiseArr.reduce((accum, p) => accum.then(p), Promise.resolve())
}

//Example, this prints.. 1, 2, 3 then "done".
runSequentially([Promise.resolve(1).then(console.log), Promise.resolve(2).then(console.log), Promise.resolve(3).then(console.log)]).then(() => console.log("done"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...