在for循环中使用async / await [英] Using async/await inside for loop

查看:2229
本文介绍了在for循环中使用async / await的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can I use async/await inside a for loop?

这是我的代码:

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

这是我定义 waRuleOverview的方式 function:

This is how I define the waRuleOverview function:

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;
}

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

It throws this error in the console:


await是保留字

await is a reserved word

此问题与这个我试图弄清楚如何解决它。

This question is related to this one which I'm trying to figure out how to solve it.

推荐答案

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

It depends on how you want your async code to be executed: sequentially or in parallel. Anyway, you'd need to add async keyword to use 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但只是希望它为副作用执行一些异步操作。

And finally, if you don't really want your handler to return a Promise but just want it to perform some async actions for side effects.

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
  });
}

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

But this approach is actually an anti-pattern since it breaks promise chains: bad for composability, error handling and such.

这篇关于在for循环中使用async / await的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆