Node.js 循环请求-范围/响应顺序错误

Node.js 循环请求-范围/响应顺序错误,node.js,parallel-processing,request,Node.js,Parallel Processing,Request,在执行对.m3u8主播放列表Url的请求后,如 经过一些处理后,我得到了一组格式副本,我将它们存储到一个对象中,并准备了一些其他东西,结果如下 var set = { input_url:'https://something.example.com/master.m3u8', renditions:[ { id:0, url:'https://something.example.com/master_264.m3u8', chunks:

在执行对.m3u8主播放列表Url的请求后,如

经过一些处理后,我得到了一组格式副本,我将它们存储到一个对象中,并准备了一些其他东西,结果如下

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

    }

  });

}
for(变量i=0;i
我相信这和范围有关?如果我没有引用回调中的原始var集,而是将repsones推到另一个数组中,就像它们进来一样,它会工作,但是它们会被无序存储。因此,首先是第五个格式副本的重复,然后是第三个格式副本,然后是第四个格式副本,依此类推(因为这是一个异步操作)

有没有办法解决这个问题,也许是完全不同的?最佳实践?谢谢

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

第一次尝试: 我试着使用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);

  }

 }

}
函数块(格式副本集,回调){
var请求_complete=false;
var已完成\u请求=0
格式副本\u set.renditions.forEach(函数(条目){
请求(entry.url、函数(错误、响应、正文){
var split=body.split('\n');
对于(变量i=0;i
因此,我最终使用了一种基本上自动处理所有URL请求的方法,它等待所有请求完成,然后将结果返回到一个包中&,以便发出请求。。。这是相当整洁的

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

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

  return callback (null, res)

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

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

  return callback (null, res)

});