我从一个演示离子应用程序(离子启动myApp sidemenu)开始,and added a
resolve
to one of the views:
resolve: { issue: function($q,$timeout) { var defer = $q.defer(); //defer.reject(); // Doesn't work browser or device $timeout(defer.reject); // Works in browser,but not device return defer.promise; } }
我在这里监视被拒绝的决议:
.run(function($ionicPlatform,$rootScope,$ionicLoading) { $ionicPlatform.ready(function() { // regular stuff here $rootScope.$on('$stateChangeError',function() { $ionicLoading.show({ template: 'All good!' }); }); }); });
出于某种原因,如果resolve立即拒绝(参见上面的defer.reject()),则不会运行$stateChangeError的回调.如果我做的完全相同,但在Ionic之外,it works!
此外,尝试通过$timeout(defer.reject)来延迟解析拒绝;导致不同的行为.现在它按预期在浏览器中工作,但仍然无法在设备上运行.试图延迟更多,导致设备成功:
$timeout(function() { defer.reject(); },250); // Doesn't work for me with 200 or less
任何人都可以阐明这一点吗?
根据我对Angular和promise模型的经验.为了解决/拒绝一个承诺,Angular必须勾选JS事件循环的一个循环 – nextTick – 这可以使用$scope.apply()完成,这就是我们在单元测试中模拟这些东西的方法.
原文链接:https://www.f2er.com/angularjs/142385.html这是一个很棒的article,讨论$timeout和$scope.$evalAsync – 从我可以收集到的$timeout正在评估下一个tick中的函数.这个代码按照您概述的方式工作的原因是什么.
resolve: { issue: function($q,$timeout) { var defer = $q.defer(); //defer.reject(); // <---- no nextTick $timeout(defer.reject); // <---- $timeout evaluates on nextTick return defer.promise; } }
这是另一个article,讨论了$q的textTick实现.
我知道这不能解决你的问题 – 但它应该说明为什么会这样!祝你好运!