所以我写了一个很好用的脚本,但我想让请求异步。目前,每一个都在前一个完成后运行,我不得不这样做,因为我无法知道总页数。我必须点击请求,直到收到错误。
有没有更好的方法来编写这段代码?
var getResponse ='true'; var newNum = 0; var responses = [];
async.whilst( function(){ //启动异步while循环 return getResponse =='true';
},
function (callback) {
// calls everytime
newNum++;
console.log('num',newNum);
var options = {
url: 'http://upload-api.kooaba.com/api/v4/buckets/sdfsfsfsfsdfsd/items?page='+newNum,
}
request(options, function(error, response, body) {
var info = JSON.parse(body);
if(info.offset) {
getResponse = false;
console.log('end of the records');
console.log("All loaded.");
var jsonSize = _.size(responses);
console.log('size',jsonSize);
res.json(responses);
}
else {
_.each(info, function(obj) {
var imageObj = {
uuid : obj.uuid,
enabled: obj.enabled,
title: obj.title,
itemCode: obj.reference_id,
num_images: obj.num_images,
bucket: 'uk'
}
responses.push(imageObj);
});
callback();
}
});
},
function (err) {
// End loop
console.log('end');
}
);
答案 0 :(得分:0)
Async.js倾向于处理已知的数据集,并且一旦启动就不会接受对它们的更改。
由于没有其他人回复,我提出了基于循环的应用程序处理的一般想法。这是一种使用同步 while循环执行所需操作的hacky方法,尽管这可能需要进行优化,因为它可能会证明CPU代价高昂:
var flag = false; // Will be used to indicate loop break time.
var expectedResponses = 0; // Will count sent requests
var arrRequests = []; // Will be used as the queue, constantly getting requests pushed.
var arrResponses = []; // Will be used to keep the responses.
while (!flag || expectedResponses < arrResponses.length) {
if (arrRequests.length) {
var requestParams = arrRequests.pop();
expectedResponses++;
request(requestParams, function cb(err, res) {
if (err) {
// Handle error and:
expectedResponses--;
return;
}
arrResponses.push(res);
});
}
}
// Process responses here.
// This code will not be reached before flag is raised, AND queue is processed.
说明:此同步循环不等待回调。每次处理内部代码时都会迭代,并且达到结束}
。原因是它正在等待一个返回语句,它以return null;
应手动引发注释标志,以便在所有请求都收到响应后允许中断循环。 此外,您可能需要考虑将此重写为基于事件,具有新请求事件,以及在引发标志并收到最后响应时触发的第二个事件。