AngularJS推迟了范围内的特定行为

时间:2013-05-29 20:58:47

标签: angularjs deferred angularjs-scope angularjs-service

假设我们有一些像这样的HTML:

<button
  id="my-login-button"
  ng-hide="loggedIn"
  ng-click="login()">Log me in!</button>

我们还有一个JavaScript:

// controller.js
$scope.login = function () {
    API.login()
      .then(function () {
        console.log('login promise resolved');
      });
};

// service.js
app.factory('API', ['$q', '$timeout', function ($q, $timeout) {
  return {
    login: function () {
      var login = $q.defer();

      // async login
      VK.Auth.login(
        function () {
          // login.resolve();       // doesn't work without $timeout()
          $timeout(login.resolve);  // works as it should
        },
        VK.access.FRIENDS | VK.access.AUDIO
      );

      return login.promise;
    }
  };
}]);

这段代码正常工作,但神秘部分靠近$timeout()函数。为什么我要解决这个问题呢?没有它,为什么代码不能按预期工作?

我不会对范围变量做些什么,我只是安慰。没有$timeout,它将被下一个摘要调用...

至于我,没有任何意义,如果我需要更改范围道具,我会将所有内容包装在$apply中。

有人可以解释为什么通常的延期行为会变得神秘吗?

P.S。在阅读this question answers后,我已用$timeout解决了我的问题。

1 个答案:

答案 0 :(得分:2)

在AngularJS中,promise结果在$ digest循环内异步传播。因此,then()的结果不会传播,直到下一个摘要周期,从而没有$timeout$http$apply来触发一个。

另见Promise callback not called in Angular JS