我执行{。{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);
}
}
}
答案 0 :(得分:0)
所以我最终使用async基本上自动处理所有网址的所有请求,等待所有内容完成并将结果返回给一个包&amp; 按顺序请求已经完成......这非常简洁。
async.map(urls, httpGet, function (err, res) {
if (err) return console.log(err);
return callback (null, res)
});