async

async

async函数是Generator函数的语法糖.将*换成await,将yield转换为await,不需要co模块那样的执行器来保证自动执行,返回值是Promise(那还用那么麻烦的东西干嘛,cao)。

const asyncReadFile = async function () {
  const f1 = await readFile('/etc/fstab');
  const f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

async函数抛出错误会导致Promise对象变成reject状态,抛出的错误对象被catch捕获,前一个return会被then回调函数收到。

  • 返回的Promise对象只有等到内部所有的await后面的Promise对象执行完,才会状态变化.
  • 对应的,使用到了thenable对象都会将它等同于Promise对象。
  • 如果await后面的Promise对象变为reject状态,整个async函数会被中断执行。
  • 如果希望在前一个await语句出错时,后面的await语句可以继续执行:
//使用try...catch
try{
    await ...
}catch(e){

}
await ...
//使用catch
async function f(){
    await Promise.reject('出错了')
    .catch(e => console.log(e));
}

实现出错时多次尝试访问的功能:

  for (i = 0; i < NUM_RETRIES; ++i) {
    try {
      await superagent.get('http://google.com/this-throws-an-error');
      break;
    } catch(err) {}
  }

发送并发请求时,为了并发执行,注意async函数内部是继发执行的,而外部循环async可以达到并发执行的效果:

//继发执行:
async function logInOrder(urls){
  const res=await fecth(url);
  return ...
}
//并发
const text=urls.map(async url=>{
  const res=await fetch(url);
  return ...
})

顶层await的使用,用于对模块进行加载操作:
export const output=someProcess((await dynamic).default,await data)

posted @ 2022-10-24 15:24  梦呓qwq  阅读(75)  评论(0编辑  收藏  举报