在 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 传回结果的异步函数需要更改调用代码。没有办法解决这个问题。
假设我将函数 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 传回结果的异步函数需要更改调用代码。没有办法解决这个问题。