2017-02-09 94 views
0

我想我正在嘗試做一些簡單的事情,但我沒有解決它的運氣。我想創建一個observable,通知其訂閱者何時調用另一個對象的方法。我認爲RxJS Observable是正確的方法,但我不知道如何創建我的Observable。我無法像在DataLib庫中那樣修改handle.ready函數。如何從方法創建rxjs可觀察值

//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. 
}); 

如何創建myObservable,以便在handle.ready()被調用時通知訂閱者?

+1

我不清楚你想做什麼。一個箱子會有所幫助。看起來你有不正確的訂購。在你的代碼中,無論「handle」是什麼,observable都被創建和訂閱。在不瞭解handle/getMyHandle的情況下,我很難提出建議。您可能想要使用「創建」方法。或者,一個Rx.Subject可以工作。堅持'const subject = new Rx.Subject();'然後在getMyHandle.ready()'subject.onNext('event')裏'' –

+0

你是對的,如果我有權修改ready()方法,我可以按照你的建議去做。但是,句柄對象來自另一個庫,所以我無法修改ready方法。我知道的唯一事情就是在將來的某個時候,handle.ready()將被調用。當handle.ready()被調用時,我想讓我的訂閱者知道,以便他們可以獲取他們一直在等待的數據。謝謝。 –

+0

調用'handle.ready'多少次?你可以想象用這個簡單的承諾。 –

回答

0

附加處理的唯一方法是將handle.ready()似乎取代它..?

通常庫API會更喜歡這個

DataLib.handleDataAsyncronously(handler); 

或有事件發射器的形狀(onReady())不是這樣的:

let handle = DataLib.getDataAsyncronously(); 

我只是假設你的庫做有一個精確的API,正如你在這裏所描述的,而不是你可能過於簡單化了它的API。

實現依然簡單。使得一些假設,包括原來的handle.ready()仍然需要被調用,我會寫這樣的事:

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 
}); 

如果你的圖書館至少會返回一個事件發射器,你可以做些什麼美麗如:

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