簡體   English   中英

不使用async / await,順序執行promises數組

[英]Execute an Array of promises sequentially without using async/await

讓我們說我有一系列的承諾。 我的數組的每個元素都是一個knex.js查詢構建器,可以執行並返回一個promise。

如何順序運行此數組的每個元素。 該數組是動態構建的。

let promisesArray = [q1,q2,q3] ;

每個q本身不是一個承諾,但它會在執行時返回一個承諾。

這可能是一個可能的選擇:

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

您可以使用Array.reduce將Array減少為一個接一個地鏈接它們的promise

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"))

我能想到藍鳥的承諾,這應該可以解決你的問題。 將並發值保持為1,應該按順序執行promise。

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

根據您聲稱q1,q2,q3是“knex.js查詢構建器並准備好執行並返回一個promise”的聲明,獲取一個函數,以便在解析promise時使用下一個索引執行自身。 先用0調用它。

function awaitPromise(arr, idx) {

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

       console.log(res);

       if (idx < arr.length - 1)      
           awaitPromise(arr, idx + 1);
   })
}

您可以將Promise.map與並發設置為1

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM