javascript - 同步解决HTTP延迟 promise

标签 javascript angularjs angular-promise

我是 Angular promise 的新手。我只是想知道如何同步解决 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 promise 之前,它会到达下一行。我尝试在响应中使用另一个延迟,但它不起作用。那么如何在“3”之后到达“4”呢?这是 plunker 链接,http://plnkr.co/edit/AI8OJAgqFDVXb1fRYbix?p=preview

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

最佳答案

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

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

要获得对 Promise 的真正出色的解释,请查看 this诺兰·劳森 (Nolan Lawson) 的博客文章。

关于javascript - 同步解决HTTP延迟 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36333410/

相关文章:

javascript - 在表单中插入一个按钮并在 Angular 应用程序中触发不同的操作

angularjs - AngularJS promise 数组

javascript - 如何确保$http请求在循环内按顺序执行

javascript - 如何使用jQuery获取Json数据到html

php - 使用 JavaScript 设置 HTML 选择值

forms - 如何自动将标签添加到输入字段?

javascript - 在我的案例中如何解决我的 promise 电话

php - CSS 和 Javascript 汇总文件

javascript - 基于特定表行的 SQL 字符串中使用的表数据

javascript - 使用js从字符串创建一个html元素