节点:将Async / Await与Bluebird结合使用

时间:2017-05-31 23:05:01

标签: node.js promise async-await

最近我一直在使用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表示法吗?

0 个答案:

没有答案