【问题标题】:Perform arbitrary set of asynchronous tasks执行任意一组异步任务
【发布时间】:2016-05-22 00:43:39
【问题描述】:

我的输入是从另一个来源流式传输的,因此很难使用async.forEach。我正在从 API 端点提取数据,但我对端点的每个请求限制为 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,但无法掌握它... 有什么想法吗?

【问题讨论】:

    标签: node.js asynchronous callback


    【解决方案1】:

    您应该可以这样做,但是如果该示例来自您的真实代码,您就误解了async 的一些工作原理。 doWhilst 接受三个参数,每个参数都是一个函数:

    1. async 调用的函数。获取必须调用的参数callback。在您的情况下,您需要将 this._post 包装在另一个函数中。
    2. test 函数(如果要定义响应,您将给出 response.length > 1000 的值,即布尔值)
    3. 执行停止后调用的最终函数

    为便于阅读,每个需要的函数都分开的示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多