resolve函数未启动
resolve function not firing
我正在学习AngularJs。我尝试创建一个非常简单的示例来理解Promise。请参阅以下代码:
http://jsfiddle.net/HB7LU/3221/
Index.html:
<!doctype html>
<html ng-app="myApp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
<script src="js/main.js"></script>
</head>
<body>
<div ng-controller="displayController">
<input id="Button1" type="button" value="Learn Promise" ng-click="Click()" />
</div>
</body>
</html>
main.js
var app = angular.module('myApp', []);
app.controller('displayController', function ($scope, $q) {
alert('Ctrl');
$scope.Click = function () {
alert('1');
var deferred = $q.defer();
var promisse= deferred.promise;
promisse.then(function (successResult) {
alert('Inside Promise success ' + successResult);
}, function (failureResult) {
alert('Inside Promise Failure ' + failureResult);
});
setTimeout(function () {
alert('2');
deferred.resolve('After timeout');
alert('3');
}, 1000);
}
});
超过1000的超时限制后,我可以看到警报('2')和警报('3'),但没有警报在promise.then()火内。为什么会这样?
几件事:您使用的是javascript的setTimeout。我建议使用angular提供的$timeout
。(如果你真的想使用setTimeout,你必须这样做:
setTimeout(function(){
$scope.$apply(function(){ deferred.resolve('resolving value'); });
}, 1000);
这是因为setTimeout在angular之外,它不知道promise应该被解决(因为$digest循环没有看到它已经被更改)
此外,您不能拒绝已解决的承诺(反之亦然)。承诺只能解决或拒绝一次。如果您想在解析后拒绝promise,则必须创建一个新的promise对象。
看看这个小提琴:http://jsfiddle.net/hK9XW/2/
我在这里使用了$timeout而不是setTimeout。
您需要将对resolve
的调用封装在$rootScope.$apply()
中,因为Angular.JS摘要循环中没有涵盖setTimeout
函数。但在您的情况下,更好的解决方案是简单地使用$timeout
服务,该服务保证在angular.js摘要周期内运行:
var app = angular.module('myApp', []);
app.controller('displayController', function ($scope, $q, $timeout) {
alert('Ctrl');
$scope.Click = function () {
alert('1');
var deferred = $q.defer();
var promisse= deferred.promise;
promisse.then(function (successResult) {
alert('Inside Promise success ' + successResult);
}, function (failureResult) {
alert('Inside Promise Failure ' + failureResult);
});
$timeout(function () {
alert('2');
deferred.resolve('After timeout');
alert('3');
}, 1000);
}
});
希望这能有所帮助!
相关文章:
- 为什么我的控制器没有启动函数.js脚本
- JavaScript未启动函数
- 如何在单击链接时启动函数,然后从该链接传递类
- ajax,用两个事件启动函数
- 调用 $ajax() 时如何启动函数
- JQUERY可排序插件,当可拖动元素悬停在指定的元素上时启动函数
- 我的代码在没有警报()的情况下无法正常工作;启动函数
- 上一个完成后的jQuery启动函数
- 如何使用书签在新选项卡中启动函数
- Jquery ajax,等待图像或iframe完全加载后再启动函数
- ExtJs 5-在Ext.application中未执行启动函数
- JQuery,再次启动函数?动画队列
- Javascript启动函数两次,4个函数中的1个不起作用
- 函数在单击表行时被激发,需要停止复选框才能启动函数
- 如何为此选框 jquery 添加停止和启动函数
- 重新启动函数会产生意想不到的结果
- 鼠标悬停时启动函数,鼠标移动时停止函数
- 用鼠标滚轮启动函数并单击jQuery
- 无法在“document.write();”中启动函数
- jQuery -停止后启动函数一次