2017-02-09 3 views
0

Ich denke, ich versuche, etwas einfaches zu tun, aber ich hatte kein Glück bei der Lösung. Ich möchte eine Observable erstellen, die ihre Abonnenten benachrichtigt, wenn die Methode eines anderen Objekts aufgerufen wird. Ich denke, ein RxJS Observable ist der richtige Ansatz, aber ich weiß nicht, wie ich mein Observable erstellen soll. Ich habe keinen Zugriff, um die handle.ready-Funktion wie in der DataLib-Bibliothek zu ändern.Wie erstelle ich eine rxjs Observable von einer Methode

//Lets say I need to Observe the handle object for when it calls ready(). 
let handle = DataLib.getDataAsyncronously(); 
//sometime in the future DataLib will call handle.ready() which means that  
//the data is ready. 
let myObservable = Rx.Observable.XXXXXX(handle.ready() is called); 
myObservable.subscribe(()=>{ 
    //handle.ready() method just got called. 
    //Do something now that handle.ready() has been called by DataLib. 
}); 

Wie würde ich schaffen myObservable so dass die Teilnehmer benachrichtigt werden, wenn handle.ready() aufgerufen wird?

+1

Ich bin nicht klar, was Sie versuchen zu tun. Ein Mülleimer würde helfen. Es scheint, als ob Sie die Bestellung falsch haben. In Ihrem Code wird das Observable erstellt und abonniert, unabhängig davon, was "handle" tut. Es fällt mir schwer, eine Empfehlung abzugeben, ohne mehr über handle/getMyHandle zu erfahren. Wahrscheinlich werden Sie eine create-Methode verwenden wollen. Alternativ könnte ein Rx.Subject funktionieren. Stick 'const subject = new Rx.Subject();' dann innerhalb von getMyHandle.ready() 'subject.onNext ('event')' –

+0

Sie haben Recht, wenn ich Zugang hatte, um die ready() -Methode zu ändern Tu, was du vorschlägst. Das Handle-Objekt stammt jedoch aus einer anderen Bibliothek, sodass ich die Bereit-Methode nicht ändern kann. Das einzige, was ich weiß, ist, dass in der Zukunft handle.ready() aufgerufen wird. Wenn handle.ready() aufgerufen wird, möchte ich meine Abonnenten wissen lassen, damit sie dann die Daten erhalten, auf die sie gewartet haben. Vielen Dank. –

+0

Wie oft wird 'handle.ready' aufgerufen? Sie könnten dafür ein einfaches Versprechen verwenden. –

Antwort

0

Die einzige Möglichkeit, an handle zu befestigen wäre to handle.ready() scheint es zu ersetzen ..?

Typischerweise Bibliothek APIs wäre ähnliche

DataLib.handleDataAsyncronously(handler); 

oder haben die Form eines Ereignis-Emitter (onReady()) als wie folgt aus:

let handle = DataLib.getDataAsyncronously(); 

Ich werde nur die Bibliothek übernimmt haben Sie eine API, genau wie Sie hier beschrieben haben, anstatt Sie vielleicht zu stark vereinfacht API.

Die Implementierung bleibt einfach. Erstellen einer Reihe von Annahmen, einschließlich, dass die ursprüngliche handle.ready() noch aufgerufen werden muss, würde ich so etwas schreiben:

const originalHandler = handle.ready.bind(handle); 
const ready$ = new Rx.Subject(); 
handle.ready =() => { 
    originalHandler(); 
    ready$.onNext(true); 
} 

ready$ 
    .switchMap(Rx.Observable.from(handle.generatedValues)) // I assume this happens? 
    .subscribe((handleValue) => { 
    // handle.ready() method just got called. 
    // Do something now that handle.ready() has been called by DataLib. 
    // Or work with handleValue 
}); 

Wenn die Bibliothek zumindest würde ein Ereignis Emitter zurückkehren, könnten Sie etwas tun schön wie:

const ready$ = Rx.Observable.fromEvent(handle, 'ready');