遍历一系列函数,其中一些返回承诺而其他不返回

时间:2020-02-28 22:41:18

标签: javascript node.js generics async-await polymorphism

我想知道如何最好地迭代和执行其中一些返回承诺的函数数组,因此我们想利用await而大多数不返回承诺,因此,我们将它们设置为async

for (let i = 0; i < this.steps.length; i++) {
      request = await this.steps[i].run(request);
    }

我们需要按顺序执行,因此我们要使用await,因为其中有两个函数发出外部HTTP请求,而其他函数已经同步工作,因此不需要await,但是我们不得不从中添加async它们,以便我们可以编写上面的通用代码。

2 个答案:

答案 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);
  
})();