在 ES6 中使用 await 作为异步函数的别名

Alias an async function with await in ES6

假设我将函数 fA 实现为 同步 调用,而在另一个模块中,此类功能是使用不同的名称实现的(比如 fB ) 并作为 异步 调用。

要使用新模块,如果可能,我不想更改每个现有的函数调用 fA。所以,

有什么办法可以给这样的异步函数调用fB起一个别名fA吗?例如:

const fA = await fB

不,你不能那样做。 await 仅在您的函数 return 的承诺下起作用,而不是在函数本身上起作用。

而且,没有办法将异步接口转换为同步接口——这在 Javascript 中是做不到的。因此,如果所有使用同步 fA() 的代码现在都想使用异步 fB() 那 return 是一个承诺,你将不得不改变你现在调用的所有地方 fA() 使用 fB() return 与 await.then() 一起枯萎的承诺。没办法。

当然,如果您向我们展示了 fA()fB() 的实际代码以及使用 fA() 的代码,我们可能会对如何最好地适应有更具体的想法调用 fA().

的现有代码

现在你的问题是一个理论问题,所以我们只能提供一个理论答案。 Whosebug 答案通常对实际代码更有帮助,因此我们可以提供适合您实际代码的具体建议。


请注意,您可能想像这样为 fB() 制作一个包装器:

function fA() {
    return await fB();
}

但是,你不能那样做,因为为了使用 await,你必须做到 async:

async function fA() {
    return await fB();
}

这实际上与:

function fA() {
    return fB();
}

这意味着 fA() 包装器仍然只是 return 一个承诺,就像 fB() 所做的那样(所有 async 函数 return 一个承诺),因此这个包装器不会为您的调用者完成任何事情。


要使用异步函数,调用者必须使用该函数使用的任何异步调用机制(回调、承诺、事件等)。因此,从直接 returns 值的同步函数切换到通过 promise 传回结果的异步函数需要更改调用代码。没有办法解决这个问题。