需要一种方法或工具来等待节点中的代码块

时间:2017-05-17 01:18:20

标签: node.js async-await coroutine

ES2017 async/await功能非常棒。它减少了编写递归回调的痛苦。但是,我有时会看到像unhandled promise rejection这样的nodejs运行时警告。原因是我忘记将await放在async代码块中的每个位置

function action1Async() {
  return new Promise((resolve, reject) => {
    resolve('good name async function')
  })
}
async function action2() {
  return new Promise((resolve, reject) => {
    reject('bad name async function')
  })
}

async function main() {
  const r1 = await action1Async()
  const r2 = action2() // The name is bad, I dont realize it is an async function. Actually throw an exception
  return r1 + r2
}

从代码示例中可以看出,除非我在每个函数调用中放置await,否则很容易让代码出错。我认为ES草案社区有理由发明await来控制async块内的行为。

我编写正确的代码没有问题。但是我认为在代码块中编写这么多await并且我打算在同步中运行它会太全面了。是否可以自动解决代码块中的所有承诺,就像协程一样?有一些静态工具还是神奇的JS库?

提前致谢

1 个答案:

答案 0 :(得分:1)

如果您可以将结果作为一组值处理,那么Promise.all函数将正常工作。

async function main() {
  const r1 = await action1Async()
  const r2 = action2() // The name is bad, I dont realize it is an async function. Actually throw an exception
  return Promise.all([r1, r2]).then(function (res) {
      return res[0] + res[1];
  })
}

main()
.then(console.log)
.catch(console.log);