不使用异步/等待顺序执行承诺数组

时间:2019-04-25 08:04:37

标签: javascript node.js promise

说我有很多承诺。我数组的每个元素都是一个knex.js查询生成器,可以执行并返回一个Promise。

如何依次运行此数组的每个元素。 该数组是动态构建的。

let promisesArray = [q1,q2,q3] ;

每个q本身都不是一个承诺,但执行后会返回一个承诺。

5 个答案:

答案 0 :(得分:5)

这里可能是一种选择:

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.
})

答案 1 :(得分:0)

您可以使用Array.reduce将Array简化为一个将它们依次链接的诺言

 <g clip-path="url(#poly)">

答案 2 :(得分:0)

我可以想到蓝鸟的承诺,这应该可以解决您的问题。将并发值保持为1,应按顺序执行promise。

    var Promise = require("bluebird");
    Promise.map([q1,q2,q3], {concurrency: 1})

答案 3 :(得分:0)

根据您的说法,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);
   })
}

答案 4 :(得分:0)

您可以将Promise.map的并发设置为1

await Promise.map(arrayOfObj, async (obj) => {
    await this.someOperation();
  },
  {concurrency: 1}
);