很惊讶地看到为什么使用$interval
服务多次解析angularjs promise。以下是我的代码。变量i
多次递增,但承诺只解析一次。
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, myService) {
myService.then(function(result) {
$scope.i = result;
});
});
app.factory('myService', function($interval, $q) {
var deferred = $q.defer();
var i = 0;
$interval(function() {
i += 1;
deferred.resolve(i);
}, 2000);
return deferred.promise;
});
答案 0 :(得分:5)
承诺代表一个递延价值。它不会解决多次。
如果您想要事件流的类似功能,请查看Rx.JS
使用Rx,您的代码看起来很相似:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, myService) {
myService.subscribe(function(result) {
$scope.i = result;
});
});
app.factory('myService', function($interval, $q) {
var subject = new Rx.Subject();
var i = 0;
$interval(function() {
i += 1;
subject.onNext(i);
}, 2000);
return subject;
});
答案 1 :(得分:5)
使用AngularJS,您可以使用$ q(https://docs.angularjs.org/api/ng/service/ $ q)的通知功能而不是解决:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, myService) {
// Notice that the third callback is for notify
myService.then(null, null, function(result) {
$scope.i = result;
});
});
app.factory('myService', function($interval, $q) {
var deferred = $q.defer();
var i = 0;
$interval(function() {
i += 1;
deferred.notify(i);
}, 2000);
return deferred.promise;
});
您可能希望添加$ interval.cancel()以在某个点/条件(https://docs.angularjs.org/api/ng/service/ $ interval)停止循环。