Reputation: 8346
Surprised to see why the angularjs promise is not resolved multiple times using $interval
service. Below is my code. The variable i
is incremented multiple times, however the promise is resolved only once.
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;
});
Upvotes: 6
Views: 1988
Reputation: 158
Using AngularJS, you can use the notify feature of $q (https://docs.angularjs.org/api/ng/service/$q) instead of resolve:
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;
});
You might want to add a $interval.cancel() to stop the loop at some point/condition (https://docs.angularjs.org/api/ng/service/$interval).
Upvotes: 5
Reputation: 7919
A promise represents a single deferred value. It will not resolve more than once.
If you want similar functionality for streams of events, check out Rx.JS
With Rx your code would look similar:
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;
});
Upvotes: 6