2017-02-02 2 views
3

Wie bekomme ich mehrere Abonnenten warten das gleiche Versprechen zu lösen, wenn es bereits bei Nachzügler angesichts einer neuen Auflösung inflight ist?RxJs - Mehrere Abonnenten warten auf das gleiche Ergebnis eines Versprechens

doSomething =() => { 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(Math.random(), 1000) 
    }) 
} 

// how to define obs? 

obs.subscribe(v => console.log(v)); // 0.39458743297857473 
obs.subscribe(v => console.log(v)); // 0.39458743297857473 
obs.subscribe(v => console.log(v)); // 0.39458743297857473 

setTimeout(() => obs.subscribe(v => console.log(v)), 2000); // 0.9485769395265746 

Ich möchte die beobachtbaren, bis der erste Teilnehmer kalt bleiben, dann kalt gehen wieder nach dem Ergebnis für alle nachfolgenden gleichzeitige Teilnehmer gestreamt wird. Ich möchte im Grunde keine gleichzeitige Anfragen an die gleiche zugrunde liegende Funktion.

Antwort

3

Sie defer als creation-Operator verwenden und dann share der Strom:

doSomething =() => { 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(Math.random(), 1000)); 
    }); 
} 

const obs = Rx.Observable 
    .defer(doSomething) 
    .share(); 

obs.subscribe(console.log); // resolve #1 
obs.subscribe(console.log); // resolve #1 
obs.subscribe(console.log); // resolve #1 

setTimeout(() => obs.subscribe(console.log), 2000); // resolve #2 
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script> 
+2

Nizza Antwort, obwohl einige Links zu den docs wäre schön! –

+1

Gut, ich habe einige Links zu den Dokumenten hinzugefügt. – olsn

+0

Das funktioniert für das Beispiel, das ich gab, also habe ich akzeptiert. Vielen Dank für deine Hilfe. Ich habe das tatsächlich früher ausprobiert und es ist nicht für meinen tatsächlichen Anwendungsfall, im Gegensatz zu dem Beispiel, das ich gab, um Dinge zu vereinfachen. Ich sehe jetzt, warum es nicht funktioniert, es ist nicht wiedereintretend. Am Ende der Pipeline, die obs verwendet, gibt es einen Bibliothekscode, der subskribiert wird, und in seinem Block neNext erzeugte er eine Aktion, die ... Trommelwirbel ... auf obs verließ und so festgefahren war. Ich weiß nicht, wie ich immer mit diesen blutigen schrecklichen Randfällen enden werde! :-) – mysomic

Verwandte Themen