我们经常同步启动变量。
const x = call_a_sync_function();
但是当启动器变得异步时,就会出现问题。
const x = await call_an_async_function(); // SyntaxError: Unexpected reserved word
我尝试了匿名异步启动器,但这并不完美。
let x;
(async () => x = await call_an_async_function())();
export function func() {
call(x); // x would be undefined if func() is called too early.
}
然后我尝试在匿名异步启动器中导出函数,再次失败。
(async () => {
const x = await call_an_async_function();
export function func() { // SyntaxError: Unexpected token export
call(x);
}
)();
那么,有没有更好的解决方案?
答案 0 :(得分:2)
这是this problem的特例。异步代码无法转换为同步代码。如果在导出中使用了承诺,则应导出承诺:
const x = call_an_async_function();
export async function func() {
call(await x);
}
一旦有了promise,基于promise的控制流就会传播到应该维护执行和错误处理的顺序的所有地方,直到入口点:
import { func } from '...';
(async () => {
await func();
...
})().catch(console.error);
答案 1 :(得分:1)
将所有内容包装到异步函数中,
async function getX() => {let x = await call_an_async_function()); return x;}
function func() {
call(x); // x would be undefined if func() is called too early.
}
async function main(){
let x = await getX()
func();
}
main()
一旦top-level-await
成为ecmascript(proposal)的一部分,您就不必在异步函数中包装等待,并且可以在顶层使用await
。
答案 2 :(得分:0)
现在,我们可以在节点上使用--harmony-top-level-await
。