我想知道如何最好地迭代和执行其中一些返回承诺的函数数组,因此我们想利用await
而大多数不返回承诺,因此,我们将它们设置为async
。
for (let i = 0; i < this.steps.length; i++) {
request = await this.steps[i].run(request);
}
我们需要按顺序执行,因此我们要使用await,因为其中有两个函数发出外部HTTP请求,而其他函数已经同步工作,因此不需要await,但是我们不得不从中添加async它们,以便我们可以编写上面的通用代码。
答案 0 :(得分:0)
如果您使用的是Node.js 10.x或更高版本,则可以使用
util.types.isAsyncFunction(function foo() {});
检查它是否是一个异步函数。如果早于该时间,则可以使用theFunc.constructor.name == 'AsyncFunction'
然后可以使用三元:
request = util.types.isAsyncFunction(this.steps[i].run) ? await this.steps[i].run(request) : this.steps[i].run(request)
答案 1 :(得分:0)
您可以将函数调用包装在Promise.resolve中以确保它是异步的,并使用await无需担心。因此,您只需将一行更改为
request = await Promise.resolve(this.steps[i].run(request));
演示
(async () => {
let steps = [
{run: async (stuff) => new Promise(r => setTimeout(() => r("step 1"), 700))},
{run: (stuff) => stuff + " step 2"},
{run: async (stuff) => new Promise(r => setTimeout(() => r(stuff + " step 3"), 100))},
{run: (stuff) => stuff + " step 4"},
{run: async (stuff) => new Promise(r => setTimeout(() => r(stuff + " step 5"), 300))}
];
let request = "";
for (let i = 0, s; s = steps[i]; i++) {
request = await Promise.resolve(s.run(request));
}
console.log(request);
})();