在我的控制器中,我得到了另一个服务的承诺。我向其中添加了一个“then”子句,但“then”从未被调用。
看看这个笨蛋:http://plnkr.co/edit/dX0Oz1?p=preview http://plnkr.co/edit/dX0Oz1?p=preview (JavaScript 版本 http://plnkr.co/edit/tB1W6gND68GVlCNKV8H4)
'fakeLongRunningPromise' 创建一个在 2 秒后自行解析的 Promise。
在控制器本身中,一旦承诺得到解决,我就会向控制台发送一条注释。
我可以看出承诺正在得到解决,因为“正在解决承诺”它输出到控制台。为什么它不输出“承诺已解决”?
认为承诺可能会因为控制器返回而“超出范围”?
AngularJS 的 Promise 解析结果是在 $digest 循环内异步传播的。所以,回调注册了then
仅在进入 $digest 周期时才会被调用。这setTimeout
执行“AngularJS 世界之外”,因此不会触发回调。
解决方案是使用Scope.$apply
or the $timeout
服务。这是带有 $apply 的版本:
window.setTimeout(function() {
console.log("Resolving promise");
$scope.$apply(function(){
deffered.resolve("worked");
});
}, 2000);
这是一个固定的 plunk (JavaScript):http://plnkr.co/edit/g5AnUK6oq2OBz7q2MEh7?p=preview http://plnkr.co/edit/g5AnUK6oq2OBz7q2MEh7?p=preview
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)