2014-10-02 2 views
5

Удивлен, чтобы понять, почему обещание angularjs не разрешено несколько раз с использованием службы $interval. Ниже мой код. Переменная i увеличивается несколько раз, однако обещание разрешается только один раз.Обещание AngularJS не разрешено многократно с использованием интервала

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

Хмм вместо использования внешней библиотеки вы можете использовать его как это вместо этого? ** [PLUNKER] (http://plnkr.co/edit/ZYKZIV3cvkdM71hLcN4Z?p=preview) ** – ryeballar

ответ

4

Использование AngularJS, вы можете использовать функции уведомления о $ д (https://docs.angularjs.org/api/ng/service/ $ д) вместо решимости:

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/ $ интервал).

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

Спасибо, Алекс. Не знал о Rx.JS. Благодарю. –

Смежные вопросы