Javascript 遍历一系列函数,其中一些返回承诺,另一些不';T

Javascript 遍历一系列函数,其中一些返回承诺,另一些不';T,javascript,node.js,generics,async-await,polymorphism,Javascript,Node.js,Generics,Async Await,Polymorphism,我想知道如何最好地迭代和执行一系列函数,其中一些函数返回承诺,因此我们希望利用等待,而大多数函数不返回承诺,因此,我们将它们设置为异步 for (let i = 0; i < this.steps.length; i++) { request = await this.steps[i].run(request); } for(设i=0;i{ 让步骤=[ {run:async(stuff)=>newpromise(r=>setTimeout(()=>r(“步骤1”),7

我想知道如何最好地迭代和执行一系列函数,其中一些函数返回承诺,因此我们希望利用
等待
,而大多数函数不返回承诺,因此,我们将它们设置为
异步

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

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

(如果打开的话)Node.js 10.x或更高版本,您可以使用
util.types.isAsyncFunction(函数foo(){})
检查它是否是异步函数。如果早于此,则可以使用
theFunc.constructor.name==“AsyncFunction”

然后,您可以使用三元:

request = util.types.isAsyncFunction(this.steps[i].run) ? await this.steps[i].run(request) : this.steps[i].run(request)

您可以将函数调用封装在Promise.resolve中以保证它是异步的,并使用wait而不用担心。所以你只要把这一行改成

request = await Promise.resolve(this.steps[i].run(request));
演示
(异步()=>{
让步骤=[
{run:async(stuff)=>newpromise(r=>setTimeout(()=>r(“步骤1”),700)),
{run:(stuff)=>stuff+“步骤2”},
{run:async(stuff)=>newpromise(r=>setTimeout(()=>r(stuff+“步骤3”),100)),
{run:(stuff)=>stuff+“步骤4”},
{run:async(stuff)=>newpromise(r=>setTimeout(()=>r(stuff+“步骤5”),300))}
];
让请求=”;
for(设i=0,s;s=steps[i];i++){
请求=等待承诺。解决(s.run(请求));
}
控制台日志(请求);

})();这是唯一的选择,嗯?@Rami你不知道函数是否异步。如果它是异步的,您需要等待。这个解决方案正是这样做的——检查并在需要时等待。我不知道你的期望是什么。嗯,我在想也许是一种不同的设计模式,它遵循坚实的原则,而不是这个,但这并不是世界上最糟糕的事情。嗯,这个解决方案实际上有一个问题
isAsyncFunction
只能检测标记为
async
的函数。如果函数未标记为
async
并在运行时返回
Promise
isAsyncFunction
将返回
false
。这些函数都标记为async,因此它在我的情况下工作。我觉得必须有更好的方法来完成这一点。。我觉得你的设计模式可以以某种方式进行调整——最终我觉得这是一个“结构”类型的问题。另外,众所周知,在循环中使用异步函数会带来麻烦,这不是一个好主意。我同意,问题是我不知道如何解决它,添加另一个抽象层?当前的解决方案违反了Liskov原则,所以我不知道该怎么做,这就是我发布它的原因。听起来你太注重违反原则,而不是编写易读/逻辑代码。总会有一些你正在违反的原则——你不可能取悦所有的原则(理论)。。。在不了解全局的情况下,很难提供任何解决方案。bigger picture=多态性,其中40个类中只有一个类在等待,其余的类被迫异步以实现上述通用代码。