如何在 node.js 中使用 promises 和 q 将一组函数链接在一起?

How do I chain a set of functions together using promises and q in node.js?

我有一些动态数据需要对其进行处理。工作必须按顺序进行。使用 Q Library,我想创建一个函数数组并使用序列按顺序执行代码。我似乎不太明白实现此目的的语法。

const fruits = ["apple", "cherry", "blueberry"]

function makeFruitPie (fruit) {
  return Q.Promise((resolve, reject) => {
    // Do some stuff here
    resolve(fruit+" pie")

    // Error handling here
    reject(new Error(""))
  })
}

const fruitFuncs = new Array(fruits.length)

for(var i = 0; i < fruits.length; i++) {
  fruitFuncs[i] = makeFruitPie(fruits[i])
}

// Stole this example from the github docs but can't quite get it right.
i = 0
var result = Q(fruits[i++])
fruitFuncs.forEach((f) => {
  result = result(fruits[i++]).then(f)
})

您可以使用Promise.all

Promise.all(fruits.map(fruit=>makeFruitPie(fruit).then(res=> res) )).
then(final_res => console.log(final_res))

final_res 将为您提供一系列结果

这些行

for(var i = 0; i < fruits.length; i++) {
  fruitFuncs[i] = makeFruitPie(fruits[i])
}

您已经 运行 函数,因此将开始处理它们。

假设你想按顺序执行函数,下面会更合适:

// construct the pipeline
const start = Q.defer();
let result = start.promise; // we need something to set the pipeline off
fruits.forEach( (fruit) => {
  result = result.then( () => makeFruitPie( fruit ) );
});

// start the pipeline
start.resolve();


旁注:有一个原生的 Promise 实现 supported by almost all environments。也许考虑从库支持的版本切换。

您可以使用 for..of 并按顺序执行操作。像这样

const Q = require("q");

const fruits = ["apple", "cherry", "blueberry"];

function makeFruitPie(fruit) {
  return Q.Promise((resolve, reject) => {
    // Do some stuff here
    resolve(`${fruit} pie`);

    // Error handling here
    reject(new Error(""));
  });
}

for (const fruit of fruits) {
  const result = await makeFruitPie(fruit);
  console.log(result);
}

顺便说一下,也值得考虑原生 Promise 而不是使用 q