我的输入是从其他来源流式传输的,因此很难使用async.forEach
。我从API端点提取数据,但每个端点请求限制为1000个对象,我需要获得数十万个对象(基本上所有)并且我会知道当响应包含<时,它们就完成了。 1000个物体。现在,我尝试过这种方法:
/* List all deposits */
var depositsAll = [];
var depositsIteration = [];
async.doWhilst(this._post(endpoint_path, function (err, response) {
// check err
/* Loop through the data and gather only the deposits */
for (var key in response) {
//do some stuff
}
depositsAll += depositsIteration;
return callback(null, depositsAll);
}, {limit: 1000, offset: 0, sort: 'desc'}),
response.length > 1000, function (err, depositsAll) {
// check for err
// return the complete result
return callback(null, depositsAll);
});
使用此代码,我得到iterator is not a function
的异步内部错误。但总的来说,我几乎可以肯定逻辑也不正确。
如果我不清楚我想要实现什么 - 我需要多次执行请求,并将响应数据添加到最后包含所有结果的结果中,所以我可以把它返还。我需要执行请求,直到响应包含少于1000个对象。
我也调查了async.queue
但是无法理解它......
有什么想法吗?
答案 0 :(得分:2)
你应该可以这样做,但如果那个例子来自你的真实代码,你就误解了async
的一些工作方式。 doWhilst
有三个参数,每个参数都是一个函数:
async
要调用的函数。获取必须调用的参数callback
。在您的情况下,您需要将this._post
包装在另一个函数中。test
函数(如果定义了响应,您将给出response.length > 1000
的值,即布尔值。为了便于阅读,将每个所需功能分开的示例:
var depositsAll = [];
var responseLength = 1000;
var self = this;
var post = function(asyncCb) {
self._post(endpoint_path, function(err, res) {
...
responseLength = res.length;
asyncCb(err, depositsAll);
});
}
var check = function() {
return responseLength >= 1000;
};
var done = function(err, deposits) {
console.log(deposits);
};
async.doWhilst(post, check, done);