【问题标题】:returning values from async scope in node js从节点js中的异步范围返回值
【发布时间】:2016-05-30 11:01:23
【问题描述】:

我绝对看不到这一点,所以我正在寻找一个快速的手。我一直在谷歌上搜索,但没有发现多少有帮助的东西。

设置场景:

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

如您所见,我想要实现的目标一点也不难,因此我们将不胜感激。谢谢。

【问题讨论】:

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


【解决方案1】:

我设法在以下堆栈问题的帮助下解决了我的问题; 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));
            }
        }
    });

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2019-02-12
    • 2016-03-03
    • 2012-11-24
    相关资源
    最近更新 更多