如何在node.js中异步执行多个REST API请求?

f

我想做的是执行多个远程REST API请求,在这里我希望每个请求都一个接一个地依次执行。我读到async.js是实现此目的的方法。

由于我不知道需要执行多少次,因此我正在使用async.whilst()我的想法是,一旦API返回零帖子,我将停止请求。到目前为止,这是我的代码(出于测试目的,我将循环限制为只能运行5次)。

var request = require('request');
var async   = require('async');

var APIKEY  = 'api-key-here';

var i = 0;
var continueWhilst = true;
async.whilst(
  function test() { return continueWhilst; },
  doThisEveryTime,
  function (err) {
    // Done
  }
);

function doThisEveryTime(next) {

  reqURL = 'http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=' + APIKEY + '&offset=' + i*20;  

  request(
    reqURL,
    function (err, resp, body) {
      if(!err && resp.statusCode == 200) {
        var resultAsJSON = JSON.parse(body);      
        console.log(reqURL);        
        console.log("Request #" + i + " done");
    }
  });

  i++;
  if (i===5) {
    continueWhilst = false;
  }
  console.log("Iterating, i= " + i);
  next();
}

测试输出是这样的:

Iterating, i= 1
Iterating, i= 2
Iterating, i= 3
Iterating, i= 4
Iterating, i= 5
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done
http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=api-key-here&offset=80
Request #5 done

request方法某种程度上仅考虑了最终i值80。我做错了什么,该如何解决?

量子字节

发生问题是因为您的reqURL变量没有var,并且不属于doThisEveryTime作用域。您还同时发出了所有请求,因为您没有在致电之前等待请求完成next这两件事导致使用同一URL的请求同时发生五次。请尝试以下方法:

function doThisEveryTime(next) {
    var reqURL = 'http://api.tumblr.com/v2/blog/testsite.com/posts/text?api_key=' + APIKEY + '&offset=' + i*20;  

    request(reqURL, function (err, resp, body) {
        if (!err && resp.statusCode === 200) {
            var resultAsJSON = JSON.parse(body);      
            console.log(reqURL);        
            console.log("Request #" + i + " done");
        }

        i += 1;

        if (i === 5) {
            continueWhilst = false;
        }

        console.log("Iterating, i= " + i);

        // This is in the callback for request now.
        next();
    });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Kotlin中异步对多个项目执行网络请求?

如何在 GAE 应用程序中执行异步 api 请求?

如何在Web Api中限制请求?

Node.js 的多个 API 请求

如何通过ID,node.js在rest API中发送多个帖子请求?

在使用node.js中的REST API时请求参数

如何在Node.js中生成对产品广告API URL的签名请求

如何在Node.js中使用Promise对API进行递归请求?

如何在AngularJS中执行乘法API请求

如何在ASP.net 5.0(MVC6)中执行对REST API的请求

当响应是异步的时,Node.js 中如何处理多个并发请求?

如何在Laravel API请求中获取多个ID的值

如何取消REST API请求?

带有Express异步的Node.js API:多个请求出现问题

如何在Golang请求中执行JavaScript异步代码

使用 Node js,如何使用 yahoo 天气 api 在单个请求中获取多个城市的天气提要

如何在Node.js中的单个请求中运行Google Vision API标签检测和安全搜索检测?

如何在API GET请求中插入我的API密钥?

如何在Express Node JS中获取删除请求的参数

如何在node.js的获取请求中设置localAddress?

如何在Node.js中获取标头请求

如何在node.js中配置传出的HTTP请求?

如何在Node.js中修改请求标头

如何在Node.js请求中禁用Tls 1.3

在 Node js 中 Rest Api 请求(curl 到 Node.js,python 到 Node.js)

如何在Node中设置API环境

如何在自己的API上执行非GET请求

如何在REST API请求中指定模型版本标签?

如何在Google Sheets API node.js batchUpdate请求上指定确切的工作表