2016-06-16 4 views
0

Warum müssen Sie beobachtbare Instanzmethoden verketten, damit sie funktionieren? Wenn Sie einer Variablen eine Observable zuweisen und dann eine neue beobachtbare Methode anwenden, wird die neue Methode nicht aufgerufen.RxJS Beobachtbare Methoden für die zugewiesene Variable

Zum Beispiel funktioniert das:

var source = Rx.Observable.range(1, 3) 
 
    .map(function (x) { 
 
     return x; 
 
    }) 
 
    .finally(function() { 
 
    console.log("Finally"); 
 
    }); 
 

 
var subscription = source.subscribe(
 
    function (x) { 
 
     console.log('Next: ' + x); 
 
    }, 
 
    function (err) { 
 
     console.log('Error: ' + err); 
 
    }, 
 
    function() { 
 
     console.log('Completed'); 
 
    });
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>

Aber dies stellt nicht die schließlich() -Methode:

var source = Rx.Observable.range(1, 3) 
 
    .map(function (x) { 
 
     return x; 
 
    }); 
 

 
// This is never called 
 
source.finally(function() { 
 
    console.log("Finally"); 
 
}); 
 

 
var subscription = source.subscribe(
 
    function (x) { 
 
     console.log('Next: ' + x); 
 
    }, 
 
    function (err) { 
 
     console.log('Error: ' + err); 
 
    }, 
 
    function() { 
 
     console.log('Completed'); 
 
    });
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>

Antwort

1

Observa Diese Methoden fügen dem ursprünglichen Observable keine Operation hinzu und geben dann das ursprüngliche Observable zurück, das über die Zeile weitergegeben werden soll. Sie geben tatsächlich ein neues Observable zurück.

Das zweite obige Beispiel funktioniert nicht, da source.finally() die finally() -Methode nicht an die beobachtbare Quelle anfügt. Stattdessen gibt es ein neues Observable zurück, das die finally() -Methode aufruft. Im Beispiel hat die Quellvariable also kein Wissen, dass source.finally() aufgerufen wurde. Zum Beispiel zwei Arbeiten zu machen, müssen wir folgendes:

var source = Rx.Observable.range(1, 3) 
 
    .map(function (x) { 
 
     return x; 
 
    }); 
 

 
source = source.finally(function() { 
 
    console.log("Finally"); 
 
}); 
 

 
var subscription = source.subscribe(
 
    function (x) { 
 
     console.log('Next: ' + x); 
 
    }, 
 
    function (err) { 
 
     console.log('Error: ' + err); 
 
    }, 
 
    function() { 
 
     console.log('Completed'); 
 
    });
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.2.28/rx.all.min.js"></script>