Javascript 在Angular JS服务中调用YouTube API请求

Javascript 在Angular JS服务中调用YouTube API请求,javascript,angularjs,asynchronous,youtube-api,Javascript,Angularjs,Asynchronous,Youtube Api,我在创建一个Youtube服务时遇到了问题,该服务基于“搜索词”进行简单搜索。我想做的是允许控制器调用我的youtube服务,即searchVideodogs,并以字符串形式获取视频id 此时,我注意到requestVideoId在请求完成执行之前被返回。由于不熟悉JS,我想举一个例子,说明如何在请求完成后让searchVideo函数正确返回requestVideoId (function () { 'use strict'; var serviceId = 'youtubeService';

我在创建一个Youtube服务时遇到了问题,该服务基于“搜索词”进行简单搜索。我想做的是允许控制器调用我的youtube服务,即searchVideodogs,并以字符串形式获取视频id

此时,我注意到requestVideoId在请求完成执行之前被返回。由于不熟悉JS,我想举一个例子,说明如何在请求完成后让searchVideo函数正确返回requestVideoId

(function () {
'use strict';

var serviceId = 'youtubeService';
angular.module('app').factory(serviceId, ['common', youtubeService]);

function youtubeService(common) {
    var service = {
        searchVideo: searchVideo
    };

    return service;

    function searchVideo(searchText) {
        var requestVideoId = "";
        var request = gapi.client.youtube.search.list({
            q: searchText,
            part: 'snippet'
        });

        request.execute(function(response) {
            var responseList = response.result;
            console.log(responseList.items[0].id.videoId);
            requestVideoId = responseList.items[0].id.videoId;
        });

        console.log(requestVideoId);
        return requestVideoId;
    }
}
})();
我查过这个问题。。。但我想保留searchVideo功能。我可能错过了什么。提前感谢。

searchVideo应该会返回一个承诺,并在将来得到解决。比如:

 function searchVideo(searchText) {
        var defer=$q.defer();
        var requestVideoId = "";
        var request = gapi.client.youtube.search.list({
            q: searchText,
            part: 'snippet'
        });

        request.execute(function(response) {
            var responseList = response.result;
            console.log(responseList.items[0].id.videoId);
            requestVideoId = responseList.items[0].id.videoId;
            defer.resolve(requestVideoId);
        });

        console.log(requestVideoId);
        return defer.promise;
    }
现在,您可以使用promise api,在解析promise时注册回调:

youtubeService.searchVideo“测试” .thenfunctionrequestVideoId{//可以在此处访问id}


了解和。

感谢您的精彩回答和指导。这起到了作用,帮助我开始理解这个问题。非常感谢。