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

我想要做的是做多个远程REST API请求,我希望每个请求都依次完成。 我读过,async.js是这样做的方式。

因为我不知道有多less次我要做这个请求,所以我使用了async.whilst() 。 这个想法是,我将停止请求,一旦API返回零职位。 这是我的代码到目前为止(为了testing的目的,我限制了循环运行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(); } 

testing结果如下所示:

 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方法是以某种方式只考虑到80的最终i值。我做错了什么,我该如何解决这个问题?

问题正在发生,因为您的reqURLvariables没有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(); }); }