【问题标题】:JavaScript await by default instead of manuallyJavaScript 默认等待而不是手动等待
【发布时间】:2017-06-28 02:08:39
【问题描述】:

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 之前不会真正返回。我正在做一个我更喜欢轻量级的扩展,所以我宁愿不使用 3rd 方库。

有什么办法吗?

【问题讨论】:

  • “函数 a() 直到我等了 5 秒才真正返回” 这根本不可能,除非 Chrome 向插件公开了这样的功能。
  • 全局等待是不允许的,大概是为了向后兼容。您需要将整个文件包装在异步函数中。

标签: javascript google-chrome-extension async-await ecmascript-2017


【解决方案1】:

隐式等待是不好的,原因在 this blog 中有详细说明。简而言之,考虑一下为什么不需要锁定 JavaScript。这是因为我们不担心被抢占先机。

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

您可以通过像这样包装您的顶级代码来解决这个问题:

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

不完美,但可以完成工作,不会颠倒一切。

【讨论】:

  • "global await is not allowed either" 意味着 await 表达式可以在其他任何地方使用,但事实并非如此。
  • @zeroflagL 如果我说“这辆车也不是红色的”,这并不意味着所有剩余的汽车都是红色的。
  • 没错,但这完全不同。 “红色汽车也不允许”会更像它。关键是 await 只允许在一种情况下使用:在异步函数中。提及许多不允许的情况之一并不是很有用。我们不知道 OP 的代码是否在全局范围内。
  • @zeroflagL 就像任何“我想要”的问题一样,很难知道问题到底是什么,但 OP 似乎知道 async 函数是什么,所以不需要另一个答案来强调如何这样可行。 OP 只是在全局范围内错误地使用它。我的陈述逻辑成立,即使是“任何一个”。
猜你喜欢
  • 2021-09-15
  • 1970-01-01
  • 2013-03-09
  • 2019-05-10
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多