可能重复:
angularjs - 承诺从未在控制器中解决
我将慢速 WebSockets 服务器包装在 AngularJS 服务中,然后从我的控制器调用该服务。如果我将回调链接到回调上,则一切正常,任何 UI 都会异步更新。
当我试图用来$q.defer()
清理那些乱七八糟的回调时,似乎我的 deferred 永远不会被调用。我熟悉 Python 的 Twisted 中的 deferred 概念,所以我认为从概念上讲一切都应该工作 - 但事实并非如此。
这是我能想到的最短的例子,慢速 WebSockets 服务器是用 setTimeout 函数模拟的。
<!doctype html>
<html ng-app="beta">
<head>
<title>Beta</title>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script>
<script>
var beta = angular.module('beta', []);
var BetaCtrl = function ($scope, betaServ) {
$scope.button = function () {
serv_result = betaServ.slow();
console.log(serv_result);
serv_result.then(function (result) {
console.log('callback finished');
});
}
}
beta.service('betaServ', function($q) {
this.slow = function () {
d = $q.defer()
setTimeout(function () {
console.log('before resolve');
d.resolve();
console.log('after resolve');
}, 2000);
return d.promise;
}
});
</script>
</head>
<body>
<div ng-controller="BetaCtrl">
<button ng-click="button()">Run</button>
</div>
</body>
</html>
可以运行如下:
- 按钮点击
- $scope.button() 被调用;它调用 service.slow() 函数
- service.slow() 返回一个延迟的
- 在 deferred 上注册了一个回调
- 延迟触发,触发注册的回调(这部分永远不会发生)
有任何想法吗?谢谢。