2014-10-02 18 views
5

का उपयोग करके हल नहीं किया गया है यह देखने के लिए आश्चर्यचकित है कि $interval सेवा का उपयोग करके कोणीय वादे को कई बार हल क्यों नहीं किया जाता है। नीचे मेरा कोड है। परिवर्तनीय 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

बाहरी पुस्तकालय का उपयोग करने के बजाय हम्म, आप इसके बजाय इसका उपयोग कर सकते हैं? ** [प्लंकर] (http://plnkr.co/edit/ZYKZIV3cvkdM71hLcN4Z?p=preview) ** – ryeballar

उत्तर

4

AngularJS का उपयोग करके आप $ q के बारे में सूचित सुविधा का उपयोग कर सकते हैं (:

आप घटनाओं की धाराओं के लिए इसी तरह की सुविधा चाहते हैं, बाहर Rx.JS

आरएक्स साथ

जाँच अपने कोड समान लगेगा $ क्यू) संकल्प के बजाय:

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

एक वादा एक भी आस्थगित मूल्य का प्रतिनिधित्व करता। यह एक से अधिक बार हल नहीं करेगा। https://docs.angularjs.org/api/ng/service/

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

धन्यवाद, एलेक्स। आरएक्स.जेएस के बारे में नहीं पता था। धन्यवाद। –

संबंधित मुद्दे