JavaScript 默认等待而不是手动等待

JavaScript await by default instead of manually

Async/await 真的很方便,但我想要与他们的行为相反。除非我手动要求它们等待承诺,否则其他函数不会继续运行,而是我希望函数产生,除非我手动指定它们并行继续 运行。

例如,这段代码将打印出 1 3 2:

function wait(ms) {
    return new Promise(r => setTimeout(r, ms));
}

async function a() {
    console.log("1");
    await wait(5000);
    console.log("2");
}

a();
console.log("3");

我希望它打印出 1 2 3,函数 a() 在我等了 5 秒并打印了 2 之后才真正返回。我正在做一个我更喜欢轻量级的扩展,所以我不想使用第 3 方库。

有什么办法吗?

隐式等待是不好的,原因在 this blog 中有详细介绍。简而言之,考虑一下为什么不需要锁定 JavaScript。这是因为我们不担心成为 pre-empted willy-nilly.

此外,正如 Daniel 在评论中提到的,全局 await 也是不允许的,大概是为了向后兼容。

您可以像这样包装 top-level 代码来解决此问题:

let wait = ms => new Promise(r => setTimeout(r, ms));

async function a() {
  console.log("1");
  await wait(5000);
  console.log("2");
}

(async () => {

  // Put your top level code here!

  await a();
  console.log("3");

})().catch(e => setTimeout(() => { throw e; }));

不完美,但完成了工作,没有颠倒一切。