我将慢速的WebSockets服务器包装在AngularJS服务中,然后从我的控制器调用该服务。如果我将回调链接到回调上,则一切正常,所有UI均异步更新。
当我尝试用来$q.defer()清理一团糟的回调时,似乎我的延迟请求从未被调用。我熟悉从Python的Twisted派生的概念,因此我认为从概念上讲一切都应该起作用-但事实并非如此。
$q.defer()
这是我能想到的最短的例子,慢速的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>
可以运行如下:
有任何想法吗?谢谢。
您需要使用$ apply调用回调,因为它是在Angular之外调用的。由于这是一项服务,因此您需要在服务中包含$ rootScope:
beta.service('betaServ', function($q, $rootScope) { this.slow = function () { d = $q.defer() setTimeout(function () { console.log('before resolve'); $rootScope.$apply(d.resolve); console.log('after resolve'); }, 2000); return d.promise; } });