为什么这项服务会返回承诺而不是履行承诺?

时间:2015-11-03 21:41:46

标签: javascript angularjs xmlhttprequest promise angular-promise

我理解Angular的承诺,当Angular向$http发出请求时,.then(function(res){ return res })应该等到承诺得到解决。因此,如果我将请求附加到变量,那么变量的值是否应该是已解决的承诺?

调用Github API的服务

is.service('githubApiService', function($http) {
    this.repo = function(user, repo) {
        var value = $http.get('https://api.github.com/repos/' + user + '/' + repo).then(function(json) {
            return {
                stargazers_count: json.data.stargazers_count,
                watchers_count: json.data.watchers_count,
                forks_count: json.data.forks_count, 
                watchers: json.data.watchers, 
               subscribers_count: json.data.subscribers_count
            };
        });

    return value;
    };
})

调用服务的指令

is.directive('chart', function(githubApiService) {
    return {
        restrict: 'E', 
        template: '<svg margin="[20, 30, 30, 40]", width="750" height="450"></svg>',
        link: function(scope, element, attrs) {
            var ais = githubApiService.repo('srph', 'angular-infinite-scroll');
            var ai = githubApiService.repo('thenikso','angular-inview');
            var ns = githubApiService.repo('jankuca', 'ng-scroller');

            console.log(ai); // returns a promise!
       }
   }
})

3 个答案:

答案 0 :(得分:1)

这是预期的行为。它会在所有方案中返回承诺,您需要使用.then()来获取所需的数据:

githubApiService.repo('thenikso','angular-inview').then(function(data){
    var ai = data;
});

答案 1 :(得分:0)

你无法像预期的那样获得承诺的价值。

如果您查看$q documentation,您会看到您正在链接的then方法也返回了一个承诺:

  

此方法返回一个新的promise,它通过successCallback的返回值errorCallback解析或拒绝(除非该值是一个promise,在这种情况下,使用在该promise中解析的值来解析它)承诺链接)

因此,您必须通过成功处理程序获取返回值:

githubApiService.repo(...).then(function (data) {
    // data is the object you are expecting
});

答案 2 :(得分:0)

它返回promise,因为您不知道何时将完成基础异步调用。

在某些微不足道的情况下,这可能几乎立即发生,但直到您明确地解决了这个问题。通过then方法实现或拒绝承诺,您只需要实际承诺。

考虑doSomething返回承诺的这两种方法:

    myService.doSomething().then(function(data){
      return data;
    });

    myService.doSomething().then(function(data){
      //This is some non-trivial calculation that will take a few seconds to do
      var myData = transformData(data);
      return myData;
    });

承诺允许您以相同的方式处理这两个调用,您必须使用then方法调用来解决它,并且实际上并不担心程序中的数据是否准备就绪。

相关问题