我想做的是执行多个远程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] 删除。
我来说两句