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)