如何从非异步函数的网络中调用异步函数

问题描述 投票:1回答:2

我正在使用具有一系列调用其他同步函数等同步函数的中等大小的node.js应用程序,为简单起见,在此之前,这些函数均未返回Promises。

function a(){
  ...
  return c();
}
function b(){
  ...
  return c();
}
function c(){
  ...
  return e();
}
function d(){
  ...
  return e();
}
function e(){
   // Do stuff
}

实际上比这复杂得多,并且具有一整套调用这些功能的单元/集成测试。

我们现在需要使用e()函数来等待异步函数的结果:

function e(){
   const someData = await someAsyncFunction();
   const dataINeedNow = someData.dataINeedNow;
   // Do something with dataINeedNow
}

async function someAsyncFunction(){
  ...
  return await someExternalService();
}

似乎一般的智慧是,一旦您开始返回承诺,就应该继续返回承诺。在上面的示例中,这涉及将a,b,c,d和e全部设为async,但实际上,这将涉及应用程序中的〜100项更改。

是否有一种方法可以在没有主要重构的情况下在node.js应用程序的肠道中对await someExternalService();进行一次调用?

javascript node.js asynchronous promise async-await
2个回答
1
投票
您可能应该重写整个链,以返回保证一致性的诺言,而不会使您的代码非常混乱。

但是,根据您编写问题的方式,如果您确实要返回每个后续调用的结果,则可以在嵌套外部处理promise结果。

返回function e的承诺,该承诺将一直返回到您的原始通话中

function e(){ console.log("did e"); const prom = new Promise((resolve)=>{ setTimeout(()=>{ console.log("resolved async"); resolve("dataResolve") },1000) }); return prom; }

使用来自a的响应写Do something with dataINeedNow >>

a().then((resArg)=>{ f(resArg); })

查看示例here

-1
投票
只需使用e()处理then/catch中的承诺。
© www.soinside.com 2019 - 2024. All rights reserved.