gpt4 book ai didi

AngularJS - 为什么需要 $apply 来正确解决 $q promise ?

转载 作者:行者123 更新时间:2023-12-02 22:28:13 27 4
gpt4 key购买 nike

我正在尝试在我的 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 中,resolve() 的结果是在 $digest 循环内异步传播的,而不是立即传播。这意味着使用 then() 注册的回调仅在摘要循环发生时才会被调用(稍后)。

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

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

另请参阅https://stackoverflow.com/a/14657974/215945

关于AngularJS - 为什么需要 $apply 来正确解决 $q promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14746314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com