Javascript中的异步启动器

时间:2018-10-30 05:46:40

标签: javascript node.js asynchronous ecmascript-6 async-await

我们经常同步启动变量。

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);
  }
)();

那么,有没有更好的解决方案?

3 个答案:

答案 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