2017-12-28 7 views
0

Ich baue eine Angular App. Im Konstruktor meiner Komponente initiiere ich eine Anfrage für mehrere Elemente vom Server, die natürlich asynchron ablaufen. Diese Anfragen werden an mich als rxjs/Behavior Objekte zurückgegeben, zu denen ich abonniert bin.Was ist die elegante Art, eine Liste von asynchronen Ereignissen zu bearbeiten und weiterzuführen, sobald sie alle abgeschlossen sind?

Was ich tun muss, ist die Verarbeitung fortzusetzen, sobald der letzte zurück ist. Aber ich NEED um sicherzustellen, dass sie in der Reihenfolge verarbeitet werden, in der sie eingereicht wurden, nicht unbedingt in der Reihenfolge, in der sie zurückgegeben wurden.

Ich könnte einen janky Hack zu erkennen, erstellen, wenn die letzten zurückgekehrt ist:

let counter = 0; 
let output = new Array(input.length); 
for (let i = 0 ; i < input.length ; i++) { 
    counter++; 
    fetch(input[i]).subscribe( 
    result => { 
     output[i] = result; 
     counter--; 
     if (counter === 0) { 
     // what to do at the end 
     } 
    } 
); 
} 

Und das funktioniert. Aber es ist hässlich, es ist nicht leicht zu verstehen und nicht, was ich produktionsreife Codes nennen würde.

Was ist die eckige Art, etwas zu tun, sobald eine Reihe von Themen alle erfüllt wurden?

+0

Sie sollten keine Betreffs erhalten. Wenn Sie die betreffende API verwalten, verwenden Sie '.asObservable()', um die Implementierung auszublenden. Wenn Sie das nicht tun, schlage ich vor, dass Sie eine neue Bibliothek finden. –

Antwort

3

Sie suchen forkJoin:

Observable.forkJoin(...input.map(fetch)) 
.subscribe(responses => { 
    // responses contains the emitted values after completion 
    // in the same order as input 
    }); 

Siehe the docs für weitere Informationen und einige Dinge zu achten gilt.

Als erweiterten Tipp für die Zukunft hat die rxjs-Website einen ziemlich guten Fragebogen, der Ihnen hilft, in verschiedenen Situationen den von Ihnen gesuchten Operator zu finden.

Verwandte Themen