2014-10-02 4 views
5

Zaskoczony, aby zobaczyć, dlaczego obietnica angularjs nie została rozwiązana wiele razy przy użyciu usługi $interval. Poniżej znajduje się mój kod. Zmienna i jest inkrementowana wiele razy, jednak obietnica zostaje rozstrzygnięta tylko raz.Obietnica AngularJS nie jest rozwiązywana wielokrotnie przy użyciu przedziału czasowego

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

Hmm zamiast korzystać z biblioteki zewnętrznej, możesz jej użyć zamiast tego? ** [PLUNKER] (http://plnkr.co/edit/ZYKZIV3cvkdM71hLcN4Z?p=preview) ** – ryeballar

Odpowiedz

4

Korzystanie angularjs, można korzystać z funkcji powiadamiania o $ q (https://docs.angularjs.org/api/ng/service/ $ q) zamiast zdecydowania:

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; 
}); 

Możesz chcieć dodać $ interval.cancel(), aby zatrzymać pętlę w pewnym momencie/stan (https://docs.angularjs.org/api/ng/service/ $ interwał).

+0

Dzięki, nie wiedziałem o powiadomieniu. –

5

Obietnica reprezentuje pojedynczą wartość odroczony. To nie rozwiąże więcej niż raz.

Jeśli chcesz podobną funkcjonalność dla strumieni zdarzeń, sprawdź Rx.JS

Rx Twój kod będzie wyglądać podobnie:

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; 
}); 
+0

Dzięki, Alex. Nie wiedziałem o Rx.JS. Dzięki. –