我绝对不会直截了当所以我正在寻找一个快速的手。我一直在谷歌搜索,并没有找到太多帮助。
设置场景:
我有一个使用'googleapis'软件包的节点应用。现在,我的工作正常,并且(大部分)按预期返回数据。
问题来自于我必须单独调用以获取每个视频的持续时间(只有通过单独调用才能获得该位数据)。
我似乎无法将持续时间值传递到范围内。我知道我做得不对,需要做的不同,但我在这里看不到树木。
youtubeClient.search.list({ part: 'id,snippet', maxResults: 10, q: searchTerm, type: 'video' },
function (err, data) {
if (err) {
console.error('Error: ' + err);
}
if (data) {
var returnList = [];
for (var item in data.items) {
var duration = '00:00'; // THIS IS THE VARIABLE I WANT POPULATED
var value = data.items[item].id.videoId;
youtubeClient.videos.list({ part: 'contentDetails', id: data.items[item].id.videoId },
function (err, details) {
if (err) {
console.error('Error: ' + err);
}
if (details) {
// THIS IS WHERE I AM TRYING TO SET THE DURATION FIELD FROM THE RESULT
duration = details.items[0].contentDetails.duration;
}
});
returnList.push({value: value, duration: duration});
}
res.json(returnList);
}
});
正如您所看到的,我想要实现的目标不应该是困难的,所以任何帮助都会受到赞赏。谢谢。
答案 0 :(得分:0)
我设法在以下堆栈问题的帮助下解决了我的问题; Calling an asynchronous function within a for loop in JavaScript
基本上我不得不重构一下,以便在匿名函数中得到它,但它起了作用....
youtubeClient.search.list({ part: 'id,snippet', maxResults: 10, q: searchTerm, type: 'video' },
function (err, data) {
if (err) {
console.error('Error: ' + err);
}
if (data) {
var returnList = [];
var total = data.items.length;
var count = 0;
for(var i = 0; i < total; i++){
var returnItem = {};
(function(foo){
returnItem = {
duration: '00:00',
value: data.items[foo].id.videoId
};
youtubeClient.videos.list({ part: 'contentDetails', id: returnItem.value },
function (err, details) {
if (err) {
console.error('Error: ' + err);
}
if (details) {
returnItem.duration = details.items[0].contentDetails.duration;
returnList.push(returnItem);
}
count++;
if (count > total - 1) {
// I CAN EXIT FROM HERE NOW
}
});
}(i));
}
}
});