Async。虽然有请求和未知页面限制 - 如何使请求异步?

时间:2015-02-01 13:56:36

标签: node.js asynchronous request underscore.js

所以我写了一个很好用的脚本,但我想让请求异步。目前,每一个都在前一个完成后运行,我不得不这样做,因为我无法知道总页数。我必须点击请求,直到收到错误。

有没有更好的方法来编写这段代码?

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

);

1 个答案:

答案 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;

的形式收到

应手动引发注释标志,以便在所有请求都收到响应后允许中断循环。 此外,您可能需要考虑将此重写为基于事件,具有新请求事件,以及在引发标志并收到最后响应时触发的第二个事件。