0

假设我们有一些像这样的 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.

谁能解释为什么通常的延迟行为变得神秘?

$timeoutPS在阅读了这个问题的答案后,我已经解决了我的问题。

4

1 回答 1

2

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

另请参阅在 Angular JS 中未调用 Promise 回调

于 2013-05-29T21:08:56.217 回答