执行任意一组异步任务

时间:2016-02-11 09:57:20

标签: node.js asynchronous callback

我的输入是从其他来源流式传输的,因此很难使用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但是无法理解它...... 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你应该可以这样做,但如果那个例子来自你的真实代码,你就误解了async的一些工作方式。 doWhilst有三个参数,每个参数都是一个函数:

  1. async要调用的函数。获取必须调用的参数callback。在您的情况下,您需要将this._post包装在另一个函数中。
  2. test函数(如果定义了响应,您将给出response.length > 1000的值,即布尔值。
  3. 停止执行后要调用的最终函数
  4. 为了便于阅读,将每个所需功能分开的示例:

    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);