最近我一直在使用NodeJs的async / await语法,我很喜欢它。但偶尔,我想使用像bluebird这样的库的一些功能。在那些情况下,我遇到了执行顺序问题。例如:
/// *** in util.js:
// return filename if exists, else false
async function fileExists(f) {
try {
await fs.statAsync(f);
return f;
} catch (e) {
if (e.code !== 'ENOENT') throw e;
return false;
}
}
// *** in index.js
// look for template having multiple possible file extensions
async function getTemplateFile(templateDir, stackName) {
const f = await Promise.any(_.map(['yml', 'json', 'yaml'], async(ext) =>
await util.fileExists(`${path.join(templateDir, stackName)}.${ext}`)));
if (f) return f;
else throw new Error(`Stack template "${stackName}" not found!`);
}
上面的代码在第一次运行时总会抛出'not found'异常,但之后会成功(与后续执行时缓存的文件系统数据有什么关系?)。
如何在这里避免看似竞争的情况?如果我必须使用原生蓝鸟功能,我应该完全放弃async / await语法并使用标准的.then / .catch表示法吗?