AngularJS promise未使用$ interval多次解析

时间:2014-10-02 09:54:38

标签: angularjs angular-promise

很惊讶地看到为什么使用$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;
});

Plunker

2 个答案:

答案 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)停止循环。