六 常用实例:按顺序完成异步操作

实际开发经常遇到一组异步操作,需按照顺序完成。如,依次远程读取一组 URL,再按照读取顺序输出结果。

Promise 的写法(略)不太直观,可读性差。下面是 async 函数实现

async function logInOrder(urls) {
  for (const url of urls) {
    const response = await fetch(url);
    console.log(await response.text());
  }
}

上面代码确实大大简化,问题是所有远程操作都是继发。只有前一个返回结果,才会去读取下一个,这样效率差,非常浪费时间。我们需要的是并发发出远程请求

async function logInOrder(urls) {
  // 并发读取远程URL
  const textPromises = urls.map(async url => {
    const response = await fetch(url);
    return response.text();
  });

  // 按次序输出
  for (const textPromise of textPromises) {
    console.log(await textPromise);
  }
}

上面代码中,虽然map方法的参数是async函数,但它是并发执行的,因为只有async函数内是继发执行,外部不受影响。后面的for..of循环内使用await,实现了按顺序输出

results matching ""

    No results matching ""