await是个很好用的语法,能以接近同步的方式执行异步的操作,跟回调和链式执行比,代码非常简洁。不过它也有些限制,它只能包含在模块的顶级代码块里,像forEach()之类函数的内部执行段内就不能包含await语句了,不过也好替换解决:比如
//下面这样写是错误的
dataset.forEach(item=>{
await promisefunc(item);
})
//而下面这样写是可以的
for (const item of dataset) {
await promisefunc(item);
}
再说另一个场景,比如我想获取某个指定目录下的文件列表,正常逻辑是先调用fs.access检查看目录是否存在,不存在的话,直接返回,存在的话,再调用fs.readdir读取目录内容,而js的风格是直接readdir,要么出错,要么得到目录内容。我用fs.promises.readdir,如果这个目录不存在的话,会抛出error,我不想try catch方式处理这个error,可以这样弄一下:
let diritems=await fs.promises.readdir(targetdir).catch(e=>{ return []; });
当然这样处理无法区分空目录和不存在的目录,不过在我的场景下是够用的,于是就这样简单处理了。