【问题标题】:AngularJS - why is $apply required to properly resolve a $q promise?AngularJS - 为什么需要 $apply 才能正确解决 $q 承诺?
【发布时间】:2013-02-07 07:59:24
【问题描述】:

我正在尝试在我的 Angular 应用程序中编写一个小服务,这将使我能够选择在全局 Javascript 对象中指定的配置参数。除非文档准备好,否则我不想尝试访问全局配置对象(因为我无法保证将脚本元素插入 HTML 的顺序)。

但是,我不明白为什么我需要调用 $apply 才能将分辨率实际传播到 then 回调。

myModule.service('GlobalConfigService', ['$q', '$rootScope', function($q, $rootScope) {
    var def = $q.defer();
    $(document).ready(function() {
        def.resolve(MyConfig.val);
        $rootScope.$apply();
    });

    def.promise.then(function () {
        console.log('I am called only when $apply() is called. Why?');
    });

    return def.promise;
}]);

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    在 AngularJS 中,resolve() 的结果是在 $digest 循环内异步传播的,而不是立即传播。这意味着使用 then() 注册的回调只有在发生摘要循环时才会被调用(稍后)。

    在您的代码中,没有什么会导致 Angular 进入摘要循环,因此永远不会调用 then() 回调。调用 $apply() 是导致摘要循环运行的一种方法。另一种方法:使用 ng-click 添加一个不执行任何操作的按钮,然后单击该按钮,它将导致摘要循环,您应该会看到结果:

    <button ng-click="">Force digest by clicking me</button>
    

    另见https://stackoverflow.com/a/14657974/215945

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多