首页 > 解决方案 > await 在语句语法说明中的位置

问题描述

我今天看到了这个代码片段,这是我第一次在这个位置看到 await。我从没想过把它放在这里。

for await (const req of s) {
  req.rspond({body: “Hello world\n” });
}

我会把它放在 req 之前(实际的异步命令)

for (const req of s) {
  await req.rspond({body: “Hello world\n” });
}

我在我的 puppeteer 代码中使用了类似的模式。

  for (let i of a) {
      await page.click(sel);
      await page.waitFor(wait);
}

我的问题是,如果我这样编码,它还能正常工作吗?

  for await (let i of a) {
      page.click(sel);
      page.waitFor(wait);
}

并将 await 应用于所有异步命令?等待属于哪里?

标签: javascriptsyntaxasync-await

解决方案


否 -for await是一种与暴露异步可迭代接口的对象交互的特殊方式:

const wait = () => new Promise(resolve => setTimeout(resolve, 500));
const obj = {
  async *[Symbol.asyncIterator]() {
    for (let i = 0; i < 3; i++) {
      // fetching item...
      await wait();
      yield i;
    }
  }
};

(async () => {
  for await (const item of obj) {
    console.log(item);
  }
})();

如果你有一个普通的迭代器,就像你做的那样const req of s,你需要为迭代器产生的每个项目调用一个异步函数,那么你当前的代码仍然是唯一的方法,例如:

for (const req of s) {
  await req.rspond({body: “Hello world\n” });
}

异步迭代器对于异步生成的项目很有用。从生成器生成后,它们不会暗示有关这些项目的任何内容。


推荐阅读