Javascript 如何从方法中创建可观察的rxjs

Javascript 如何从方法中创建可观察的rxjs,javascript,rxjs,observable,Javascript,Rxjs,Observable,我想我正在尝试做一些简单的事情,但我没有运气解决它。我想创建一个observable,在调用另一个对象的方法时通知其订阅者。我认为RxJS Observable是正确的方法,但我不知道如何创建我的Observable。我无权修改handle.ready函数,因为它位于DataLib库中 //Lets say I need to Observe the handle object for when it calls ready(). let handle = DataLib.getDataAsyn

我想我正在尝试做一些简单的事情,但我没有运气解决它。我想创建一个observable,在调用另一个对象的方法时通知其订阅者。我认为RxJS Observable是正确的方法,但我不知道如何创建我的Observable。我无权修改handle.ready函数,因为它位于DataLib库中

//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()时通知订阅者?

附加到handle的唯一方法是使用handle.ready()替换它

通常,库API更像这样

DataLib.handleDataAsyncronously(handler);
或者具有事件发射器(onReady())的形状,而不是如下所示:

let handle = DataLib.getDataAsyncronously();
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
});
我将假设您的库确实有一个API,正如您在这里描述的那样,而不是您可能过于简化了它的API

实现仍然很简单。假设仍然需要调用原始handle.ready(),我会这样写:

let handle = DataLib.getDataAsyncronously();
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');

我不清楚你想做什么。一个垃圾桶会有用的。看来你的订货不正确。在您的代码中,无论
handle
做什么,都会创建和订阅可观察对象。我很难在不了解handle/getMyHandle的情况下提出建议。很可能你会想使用
create
方法。或者,Rx.受试者可以工作。Stick
const subject=new Rx.subject()
然后在getMyHandle.ready()的内部
subject.onNext('event')
您是正确的,如果我有权修改ready()方法,我可以按照您的建议执行。但是,handle对象来自另一个库,因此我无法修改ready方法。我只知道在将来的某个时候会调用handle.ready()。调用handle.ready()时,我想让我的订阅者知道这一点,这样他们就可以获得他们一直在等待的数据。谢谢。
handle.ready
被调用了多少次?你可以用一个简单的承诺,我很乐意用一个承诺。handle.ready()只调用一次。将会有许多订阅者,而不是像我的示例中那样只有一个订阅者。如果我有多个订阅者,不确定Promise解决方案是否不起作用?听起来您需要将侦听事件附加到函数调用。我认为这只能在JS中通过将其包装到立即调用的函数表达式中来实现。您需要将异步数据放在一个可观察的对象中,然后将IIFE->observable放在一个.startWith操作符中。