请求for循环 - 范围/响应乱序

时间:2017-06-22 11:39:23

标签: node.js parallel-processing request

我执行{。{3}}之后的.m3u8主播放列表网址请求

request(input, function (error, response, body) {
  ...
}

经过一些处理后我得到了一组再现,我将它们存储到一个对象中,并准备了其他一些东西,结果就像

var set = {
    input_url:'https://something.example.com/master.m3u8',
    renditions:[
    {
      id:0,
      url:'https://something.example.com/master_264.m3u8',
      chunks:[]
    },        {
      id:1,
      url:'https://something.example.com/master_578.m3u8',
      chunks:[]
    },        {
      id:2,
      url:'https://something.example.com/master_928.m3u8',
      chunks:[]
    }]
};

所以我按照从最低到最高的再现顺序存储了我的一组再现。现在我需要为每个单独的再现执行另一个请求,并将它们的响应存储到每个再现的块中。

问题:第一次回调后,我收到一条错误消息 TypeError:无法读取属性' chunks'未定义的 - 这是我的代码

for (var i = 0; i < set.renditions.length; i++) {

  var done = false;

  request(set.renditions[i].url, function(error, response, body) {

    set.renditions[i].chunks.push(body);

    completed_requests++;

    if (completed_requests == set.renditions.length) {    

      return callback(null,set);

    }

  });

}

我认为这与范围有关?如果没有引用回调中的原始var set,而是将repsonses推送到另一个数组,就像它们进来一样,它可以工作,但是当然它们会被无序存储。所以首先是第5次演绎,然后是第3次演绎,然后是第4次演绎等等(因为它是异步操作)。

我应该如何解决这个问题,也许是完全不同的东西?最佳实践 ?谢谢 !

=======================

首先尝试:

我尝试使用forEach,但似乎我从中得不到任何结果...

function chunks (rendition_set, callback) {

var request_complete = false;
var completed_requests = 0

rendition_set.renditions.forEach ( function (entry) {

  request(entry.url, function(error, response, body) {

    var split = body.split('\n');

    for (var i = 0; i < split.length; i++) {
      if (split[i].indexOf('.ts') != -1 ) {
        entry.chunks.push(split[i]);
      }
    }

    completed_requests++;

  }); 

})

while(request_complete == false) {

  if (completed_requests == rendition_set.renditions.length) {

    request_complete = true;
    return callback(null,rendition_set);

  }

 }

}

1 个答案:

答案 0 :(得分:0)

所以我最终使用async基本上自动处理所有网址的所有请求,等待所有内容完成并将结果返回给一个包&amp; 按顺序请求已经完成......这非常简洁。

async.map(urls, httpGet, function (err, res) {

  if (err) return console.log(err);

  return callback (null, res)

});