2014-10-21 10 views
5

Jeśli tworzę obietnicę używając $ odstęp, to anulować Patrz: http://jsbin.com/jeweke/2/

timer = $interval(intervalFunc, intervalDelay, 10); 
timer.then(
    function(res) {console.log('ok', res);}, 
    function(err) {console.log('err', err);} 
); 

Jednak gdybym łańcucha obietnicę, zwrócony obietnica nie można anulować . Patrz: http://jsbin.com/jeweke/1/

timer = $interval(intervalFunc, intervalDelay, 10) 
.then(
    function(res) {console.log('ok', res);}, 
    function(err) {console.log('err', err);} 
); 

Co daje? Czy to właśnie tak powinno działać?

Uwaga - przykładem tutaj jest luźno adaptacją http://jsfiddle.net/ExpertSystem/fZc3W/

Odpowiedz

6

to dlatego wynikiem łańcucha obietnicy z $interval nie mają właściwość, która zawiera przedział ID ($$intervalId). Pierwszy przypadek to zapisanie obietnicy czasowej, która ma $intervalId, w drugim przypadku zapisujesz obietnicę zwróconą z łańcucha, która jest surową q obietnicą bez własności $intervalId (która jest niestandardową właściwością dodaną do obietnicy przechowywania odpowiedniego setInterval to id, kiedy dzwonisz pod numer $interval(...). Kiedy anulujesz timer, musisz $intervalId anulowaćInterval i odrzucić odpowiednią obietnicę timera.

To co interval.cancel robi

interval.cancel = function(promise) { 
     if (promise && promise.$$intervalId in intervals) { 
     intervals[promise.$$intervalId].reject('canceled'); 
     clearInterval(promise.$$intervalId); 
     delete intervals[promise.$$intervalId]; 
     return true; 
     } 
     return false; 
    }; 

Uwaga linię: -

if (promise && promise.$$intervalId in intervals) { 

intervals są tylko mapy intervalId i poszczególnych obietnicy (Przykład: - {1:promiseOfInterval1, 2:promiseOfInterval2}), więc bez intervalId nie ma anulowania. Krótko mówiąc, obietnica zwrócona przez $ interwał to q obietnica plus własność $ intervalId, a po łańcuchu dokładnym jest to tylko implementacja $q, która zwraca obietnicę nowego obiektu odroczonego.

+0

Świetne wyjaśnienie. dzięki za wkopanie się w źródło. – RoyM

+0

@roymath Serdecznie zapraszamy ... :) – PSL

Powiązane problemy