在for循环中使用async / await

时间:2017-08-04 11:21:02

标签: javascript node.js async-await

如何在for循环中使用async / await?

这是我的代码:

waRuleOverview

这是我定义export function waRuleOverview(req, runId, ruleId) { var def = deferred(); setTimeout(function() { const apiToken = req.currentUser.apiToken; const payload = { 'Authorization': 'api_key ' + apiToken } const options = { 'method': 'get', 'gzip': true, 'headers': payload, 'content-type': 'application/json', 'json': true, 'url': 'api-url' } request(options, (error, response, body) => { def.resolve(body); }); }, 50); return def.promise; } 函数的方式:

{{1}}

它会在控制台中抛出此错误:

  

await是一个保留字

这个问题与this问题有关,我试图弄清楚如何解决它。

1 个答案:

答案 0 :(得分:12)

这取决于您希望如何执行异步代码:顺序执行或并行执行。无论如何,您需要添加async关键字才能使用await

// sequential
export default async (req, callback) => {
  // ...
  for(const [rule, index] of compliance.entries()) {
    const response = await waRuleOverview(req, run.id, rule.id)

    // handle the response
  }
}

// parallel
export default async (req, callback) => {
  // ...
  const responses = await Promise.all(compliance
     .map((rule, index) => waRuleOverview(req, run.id, rule.id))
  )

  // handle responses
  responses.forEach(response => {
    // ...
    // handle response here
  })
}

最后,如果你真的不希望你的处理程序返回一个Promise但只是希望它为副作用执行一些异步操作。

export default (req, callback) => {
  // ...
  compliance.forEach(/* add */ async (rule, index) => {
    // to use await inside
    let response = await waRuleOverview(req, run.id, rule.id);
    // handle the response
  });
}

但是这种方法实际上是一种反模式,因为它打破了承诺链:对可组合性,错误处理等不利。