2017-02-09 39 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');