gpt4 book ai didi

angularjs - Angular JS : Chaining promises and the digest cycle

转载 作者:行者123 更新时间:2023-12-03 20:42:27 27 4
gpt4 key购买 nike

注意: fiddle 使用旧版本的 Angular,它不再工作,因为从 1.2 开始,Angular 模板引擎不能透明地处理 promise 。

我正在研究链接 promise 以填充我的范围,然后让范围自动更新 dom。

不过我遇到了这个问题..如果我在一个已经解决的 promise 上调用“then”,它会创建一个新的 promise (它将异步但几乎立即调用成功函数)。我认为问题是我们在调用成功函数时已经离开了摘要循环,所以 dom 永远不会更新。

这是代码:

<div ng-controller="MyCtrl">
Hello, {{name}}! <br/>
{{name2}}<br/>
<button ng-click="go()">Clickme</button><br/>
{{name3}}
</div>

var myApp = angular.module('myApp',[]);

function MyCtrl($scope, $q) {
var data = $q.defer();
setTimeout(function() {$scope.$apply(data.resolve("Some Data"))}, 2000);
var p = data.promise;

$scope.name = p.then(angular.uppercase);
$scope.name2 = p.then(function(x) { return "Hi "+x;});
$scope.go = function() {
$scope.name3 = p.then(function(x) {
// uncomment this to make it work:
//$scope.$apply();
return "Finally: "+x;
});
};
}

http://jsfiddle.net/QZM4d/

有什么方法可以使这项工作无需每次链接 promise 时都调用 $apply 吗?

最佳答案

注意 : fiddle 使用旧版本的 Angular,它不再工作,因为从 1.2 开始,Angular 模板引擎不能透明地处理 promise 。

quote @pkozlowski.opensource:

In AngularJS the results of promise resolution are propagated asynchronously, inside a $digest cycle. So, callbacks registered with then() will only be called upon entering a $digest cycle.



因此,当单击按钮时,我们处于摘要循环中。 then() 创建了一个新的 promise,但是 then() 的结果直到下一个摘要循环才会传播,这个循环永远不会出现(因为没有 $timeout、$http 或 DOM 事件来触发)。如果你用 ng-click 添加另一个按钮,什么都不做,然后点击它,它会导致一个摘要循环,你会看到结果:
<button ng-click="">Force digest by clicking me</button><br/>

这是一个 fiddle这样做。

fiddle 还使用 $timeout 而不是 setTimeout —— 那么 $apply() 就不需要了。

希望当您需要使用 $apply 时很清楚。有时您确实需要手动调用它。

关于angularjs - Angular JS : Chaining promises and the digest cycle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14657680/

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