在ES6中为一个带有wait的异步函数别名



假设我将函数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返回结果的异步函数需要更改调用代码。这是没有办法的。

最新更新