【问题标题】:Why does this service return a promise rather than a fulfilled promise?为什么这个服务返回一个承诺而不是一个履行的承诺?
【发布时间】:2016-02-04 05:23:44
【问题描述】:

我理解 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!
       }
   }
})

【问题讨论】:

  • 不。 then 等待执行回调,直到promise 完成,然后返回另一个promise。在异步任务完成之前它不会阻塞你的脚本!
  • 兑现的承诺仍然是承诺,所以你的措辞有点奇怪。我怀疑你的意思是不同的。

标签: javascript angularjs xmlhttprequest promise angular-promise


【解决方案1】:

它返回承诺,因为您不知道底层异步调用何时完成。

在一些微不足道的情况下,这可能几乎立即发生,但在您通过 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;
    });

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

【讨论】:

    【解决方案2】:

    你不能像你期望的那样得到承诺的价值。

    如果您查看$q documentation,您将看到您链接的then 方法也返回一个promise:

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

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

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

    【讨论】:

    • 谢谢,这就是我要找的答案。
    【解决方案3】:

    这是预期的行为。它在所有场景下都会返回promise,你需要使用.then()来获取你想要的数据:

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

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 2015-11-27
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多