同步解析HTTP延迟承诺

时间:2016-03-31 12:23:33

标签: javascript angularjs angular-promise

我是角色承诺的新手。我只是想知道,如何同步解决这个承诺。例如,

var app = angular.module("app", []);

app.service("githubService", function($http, $q) {

  var deferred = $q.defer();

  this.getAccount = function() {
    console.log(2)
    return $http.get('https://api.github.com/users/haroldrv')
      .then(function(response) {
        // promise is fulfilled
        deferred.resolve(response.data);
        return deferred.promise;
      }, function(response) {
        // the following line rejects the promise 
        deferred.reject(response);
        return deferred.promise;
      });
  };
});

app.controller("promiseController", function($scope, $q, githubService) {
  console.log(1) 
  githubService.getAccount()
    .then(
      function(result) {
        console.log(3)
        // promise was fullfilled (regardless of outcome)
        // checks for information will be peformed here
        $scope.account = result;
      },
      function(error) {
        console.log(3)
        // handle errors here
        console.log(error.statusText);
      } 
    );
    console.log(4)
});

在上面的代码中,值按以下顺序打印1,2,4,3。这就是调用服务并同步获取响应。但在它解决它收到的http承诺之前,它会到达下一行。我尝试在响应中使用另一个延迟,但它不起作用。那么如何在'3'之后达到'4'?以下是plunker链接http://plnkr.co/edit/AI8OJAgqFDVXb1fRYbix?p=preview

对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

你不能,这是异步调用的本质。您希望在调用完成后执行的任何代码都必须放在回调中。第4个日志语句'跳过'异步调用,因此立即执行。

提示:创建延迟对象始终是代码气味:99%的时间你真的不需要它。例如,您可以像这样编写服务代码,它将完全相同,但您的代码要短得多:

app.service("githubService", function($http, $q) {

  this.getAccount = function() {
    console.log(2)
    return $http.get('https://api.github.com/users/haroldrv')
      .then(function(response) {
        return response.data;
      });
  };
});

如果要真正优秀地解释承诺,请查看诺兰劳森的this博客文章。

答案 1 :(得分:0)

  • 在您的plunker中,如果您返回-v电话,那么您就没有 要在服务中调用$http,它将向控制器返回承诺。
  • 如果您想处理响应,请使用.then()和 那里有.success()个回调。
  • 现在来到你的.error()它的位置永远不会得到 执行是因为它是在console.log(4)之后定义的 因为JavaScript是,所以会立即以这种方式执行 异步。 githubService.getAccount()只会注册 它的回调将继续前进。

我为您创建了一个plunker,以便更好地了解javascript / angular中的承诺。

希望这有帮助