Javascript 同步解析HTTP延迟承诺

Javascript 同步解析HTTP延迟承诺,javascript,angularjs,angular-promise,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/us

我是个新手,我保证。我只是想知道,如何同步解决承诺。比如说,

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链接


在此方面的任何帮助都将不胜感激。

您不能,这是异步调用的本质。调用完成后要执行的任何代码都必须放在回调中。第四条log语句“跳过”异步调用,因此立即执行

提示:创建延迟对象总是一种代码味道: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;
      });
  };
});

要想对承诺做出真正出色的解释,请查看Nolan Lawson的博客文章。

你不能,这就是异步调用的本质。调用完成后要执行的任何代码都必须放在回调中。第四条log语句“跳过”异步调用,因此立即执行

提示:创建延迟对象总是一种代码味道: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;
      });
  };
});
要想对承诺做出真正出色的解释,请查看诺兰·劳森(Nolan Lawson)的博客。

  • 在plunker中,如果返回
    $http
    调用,则没有 要在服务中调用
    。然后()
    ,它将向控制器返回承诺
  • 如果您想在那里处理响应,应该使用
    .success()
    .error()
    在那里回调
  • 现在来到您的
    控制台。日志(4)
    在它永远不会到达的位置 执行,因为它是在githubService.getAccount()之后定义的 将立即以这种方式执行,因为JavaScript是 异步的。gitubservice.getAccount()将立即注册 它的回调将继续
我为您创建了一个示例,以便您更好地理解javascript/angular中的承诺

希望这有帮助
  • 在plunker中,如果返回
    $http
    调用,则没有 要在服务中调用
    。然后()
    ,它将向控制器返回承诺
  • 如果您想在那里处理响应,应该使用
    .success()
    .error()
    在那里回调
  • 现在来到您的
    控制台。日志(4)
    在它永远不会到达的位置 执行,因为它是在githubService.getAccount()之后定义的 将立即以这种方式执行,因为JavaScript是 异步的。gitubservice.getAccount()将立即注册 它的回调将继续
  • 我为您创建了一个示例,以便您更好地理解javascript/angular中的承诺

    希望这有助于

    首先,避免使用延迟(或者不管这种延迟的用法是什么-我不确定它是否能按预期工作,如果你真的打算这样做,有更好更简单的缓存解决方案)。将
    console.log(4)
    包装到另一个
    中,然后
    部分…首先,避免(或者不管延迟的这种用法是什么-我不确定它是否能按预期工作,如果你真的打算这样做,有更好更简单的缓存解决方案)。将
    console.log(4)
    包装到另一个
    中,然后
    部分。。。