Node.js 循环请求-范围/响应顺序错误
在执行对.m3u8主播放列表Url的请求后,如 经过一些处理后,我得到了一组格式副本,我将它们存储到一个对象中,并准备了一些其他东西,结果如下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:
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)
});