【问题标题】:How do I send requests in a for loop synchronously in nodejs?如何在nodejs中同步发送for循环中的请求?
【发布时间】:2018-11-13 02:19:18
【问题描述】:

我正在尝试使用 nodejs 中的 request 模块在 for 循环 中发出 facebook api 请求。但我需要使循环和请求调用同步。我究竟做错了什么?

    async function sendRequestAsync(sender, messageData) {
        await request({
            url: "https://graph.facebook.com/v2.6/me/messages",
            qs: {access_token: PAGE_ACCESS_TOKEN},
            method: "POST",
            json: {
                recipient: {id: sender},
                message: messageData
            }
        });
     }

     function sendFoods (sender, results) {
         results.forEach(async result => {
             await request.sendRequestasync(sender, {text: result.cat});
             await request.sendRequestasync(sender, result.data);
             console.log(result);
         });
    }

【问题讨论】:

    标签: node.js for-loop asynchronous request


    【解决方案1】:

    在 ES8 Async/Await 中,脚本在继续执行之前等待解决一个 Promise。

    async function test() {
      for (let i = 0; i < 5; i++) {
        let result = await req('http://google.com');
        console.log(result.resp.statusCode, i);
      };
    };
    
    function req(url) {
      return new Promise(function(resolve, reject) {
        request.get(url, function(err, resp, body) {
          if (err) { reject(err); }
          else { resolve({resp: resp, body: body}); }
        })
      })
    };
    

    Try my live example

    【讨论】:

    • 谢谢。它就像一个魅力。只是一个简单的问题,如果我想用 await 分别捕获解析和拒绝怎么办?
    • 不客气。 Reject 会抛出错误,如果你需要在result 变量中,将reject(err) 更改为resolve(err),结果将是错误消息。
    【解决方案2】:

    您的 sendRequestAsync 函数应该直接从请求调用中返回承诺,而不是等待它。 Await 实际上只是 .then () 的语法糖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 2016-09-27
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2016-04-09
      相关资源
      最近更新 更多