假设我将函数fA
实现为同步调用,而在另一个模块中,这种功能是使用不同的名称(比如fB
(实现的,并且是作为异步调用实现的。
为了使用新模块,如果可能的话,我不想更改函数fA
的每一个现有调用。所以,
我有没有办法给这种异步函数调用fB
一个别名fA
?类似的东西,例如:
const fA = await fB
不,你不能那样做。await
只作用于函数返回的promise,而不作用于函数本身。
而且,没有办法将异步接口转换为同步接口——这在Javascript中是做不到的。因此,如果所有使用同步fA()
的代码现在都想使用返回promise的异步fB()
,那么您将不得不更改现在调用fA()
的所有位置,以使用fB()
返回的promise随await
或.then()
一起枯萎。没办法。
当然,如果您向我们展示了fA()
和fB()
的实际代码以及使用fA()
的代码,我们可能会对如何最好地调整调用fA()
的现有代码有更具体的想法。
现在你的问题是一个理论问题,所以我们能提供的只是一个理论答案。堆栈溢出的答案通常对实际代码更有帮助,因此我们可以提供适合您实际代码的具体建议。
注意,您可能会尝试为fB()
制作这样的包装器:
function fA() {
return await fB();
}
但是,你不能这样做,因为为了使用await
,你必须使它成为async
:
async function fA() {
return await fB();
}
这实际上与相同
function fA() {
return fB();
}
这意味着fA()
包装器仍然只是像fB()
一样返回一个promise(所有async
函数都返回一个promise(,因此这个包装器不会为调用方完成任何任务。
要使用异步函数,调用者必须使用函数使用的任何异步调用机制(回调、promise、事件等(。因此,从直接返回值的同步函数切换到通过promise返回结果的异步函数需要更改调用代码。这是没有办法的。