2017-02-09 9 views
0

Я думаю, что я пытаюсь сделать что-то простое, но мне не повезло в его решении. Я хочу создать наблюдаемый, который уведомляет своих подписчиков при вызове метода другого объекта. Я думаю, что RxJS Observable - правильный подход, но я не знаю, как создать мой Observable. У меня нет доступа к изменению функции handle.ready, как в библиотеке DataLib.Как создать наблюдаемый 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'. Мне сложно сделать рекомендацию, не зная больше о handle/getMyHandle. Скорее всего, вы захотите использовать метод 'create'. В качестве альтернативы, Rx.Subject может работать. Stick 'const subject = new Rx.Subject();' затем внутри getMyHandle.ready() 'subject.onNext ('event')' –

+0

Вы правы в том, что если бы у меня был доступ к модификации метода ready(), я мог бы сделайте, как вы предлагаете. Однако объект handle исходит из другой библиотеки, поэтому я не могу модифицировать готовый метод. Единственное, что я знаю, это то, что когда-нибудь в будущем вызывается handle.ready(). Когда вызывается handle.ready(), я хочу, чтобы мои подписчики знали это, чтобы затем они могли получить данные, которые они ожидали. Благодарю. –

+0

Сколько раз вызывается 'handle.ready'? Вы могли бы использовать для этого простое обещание. –

ответ

0

Единственный способ прикрепления к ручке - это обрабатывать. Уже(), кажется, заменяет его ..?

Обычно библиотека 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');