# await

await必须在async内。 那么await等待的是什么呢?它会确保一个 promise 的内容都解决( resolve )或出错( reject )后才会进行下一步。 其实就是等待

# 以下代码输出是什么?(一)

function wait() {
  return new Promise(resolve =>
    setTimeout(resolve, 10 * 1000)
  )
}

async function main() {
  console.time();
  const x = wait();
  const y = wait();
  const z = wait();
  await x;
  await y;
  await z;
  console.timeEnd();
}

main();
  • //default: 10000.55517578125ms
  • 三个任务发起的时候没有await,可以认为是同时发起了三个异步。
  • 之后各自await任务的结果。结果按最高耗时计算,由于三个耗时一样。所以结果是 10 * 1000ms。
  • Promise中new Promise(xx)相当于同步任务, 会立即执行, .then后面的是微任务。
function wait() {
  return new Promise(resolve =>
    setTimeout(resolve, 10 * 1000)
  )
}

async function main() {
  const x = wait();
  const y = wait();
  const z = wait();
  const arrs = [
    x, y, z
  ]
  return Promise.all(arrs);
}

async function maintip() {
  console.time();
  await main();
  console.timeEnd();
}

maintip();

也可以配合Promise.all来做.

# 以下代码输出是什么?(二)

function wait() {
  return new Promise(resolve =>
    setTimeout(resolve, 10 * 1000)
  )
}

async function main() {
  console.time();
  await wait();
  await wait();
  await wait();
  console.timeEnd();
}
main();
  • //default: 32439.156982421875ms
  • wait前面加上了await,意味着主流程执行必须等到wait执行完了才会继续执行后续的函数
  • wait里面又是一个Promise,Promise必须等到setTimeout,resolve了以后才会继续执行
  • 就是外部的Prmoise必须等到内部的Promise resolve了以后才会继续执行。
  • main -> wait -> promise -> (promise -> setTimeout(resolve))(resolve)
  • 写入微任务队列,微任务队列里再写入任务队列,都是需要额外的时间,所以会超出30s多。

# await写法的选择

  • 在业务中,考虑到异步的事件是否有相互的依赖,如果没有,我们应该选择第一种,让他们按顺序发起请求,最后await等待的其实在耗时最长的那个请求。
  • 如果请求之间是有依赖的,我们可以选择第二种可以保证前一个请求完成后再执行下一个。

参考:

Last Updated: 2/19/2020, 12:38:17 PM