从节点js

时间:2016-05-30 02:00:21

标签: javascript node.js callback asynccallback google-api-nodejs-client

我绝对不会直截了当所以我正在寻找一个快速的手。我一直在谷歌搜索,并没有找到太多帮助。

设置场景:

我有一个使用'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);
            }
        });

正如您所看到的,我想要实现的目标不应该是困难的,所以任何帮助都会受到赞赏。谢谢。

1 个答案:

答案 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));
            }
        }
    });