【问题标题】:AngularJS deferred specific behavior inside the scopeAngularJS 延迟了范围内的特定行为
【发布时间】:2013-05-29 20:58:46
【问题描述】:

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

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

附:阅读this question answers 后,我已经解决了$timeout 的问题。

【问题讨论】:

    标签: angularjs deferred angularjs-scope angularjs-service


    【解决方案1】:

    在 AngularJS 中,promise 结果是在 $digest 循环内异步传播的。因此,then() 的结果在下一个摘要周期之前不会传播,如果没有 $timeout$http$apply 来触发它,则永远不会传播。

    另见Promise callback not called in Angular JS

    【讨论】:

    • 我想只有 $q 这样的行为。如果我们尝试使用 $.Deferred() 代替 - 它不会等待下一个摘要周期......这很奇怪......
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 2016-02-02
    • 2020-07-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多