我正在使用具有一系列调用其他同步函数等同步函数的中等大小的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();
进行一次调用?
但是,根据您编写问题的方式,如果您确实要返回每个后续调用的结果,则可以在嵌套外部处理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
e()
处理then/catch
中的承诺。