2016-05-11 3 views
2

Я все еще выясняю реактивное программирование, поэтому я уверен, что это очень простой, но количество преобразований потоков довольно податливо для новичков.RxJS ждать, пока не будет достигнуто обещание

Я создаю наблюдаемое событие DOM. Это событие должно в свою очередь инициировать вызов REST, и все другие события DOM будут игнорироваться до тех пор, пока это событие не будет разрешено.

const stream = Observable.fromEvent(document, 'some-event') 
stream 
    .flatMap(() => httpRestService()) 
    .subscribe(() => { 
    }) 

Как проигнорировать события из потока до тех пор, пока не будет разрешено последнее обещание HTTP?

DOM event 
A - - - - B - - - - C 
HTTP event 
D ...........done - C 
+0

Прежде всего, наблюдатель не испускает значения, он получает значения. Итак, ваш наблюдатель является наблюдаемым. Тогда я не знаю, что вы подразумеваете под «игнорированием». Эти события потеряны или поставлены в очередь? Лучший способ представить свой вопрос - указать входные и ожидаемые результаты. Это лучше всего сделать с мраморной диаграммой – user3743222

+0

@ user3743222 обновлено – Harangue

+0

Возможно, 'skipUntil' будет тем, что вы ищете? http://reactivex.io/documentation/operators/skipuntil.html – Stephen

ответ

4

Вы можете попробовать flatMapFirst, который, кажется, делает то, что вы хотите. Следующий код может работать (jsfiddle here - нажмите в любом месте):

const stream = Observable.fromEvent(document, 'some-event') 
stream 
    .flatMapFirst(() => httpRestService()) 
    .subscribe(() => { 
    }) 

Цитирование документации:

Оператор flatMapFirst аналогичен способами flatMap и concatMap, описанных выше, тем не менее, вместо того, испуская все элементы, испускаемые всеми Observables, которые генерирует оператор, преобразуя элементы из источника Observable, flatMapFirst вместо этого распространяет первый Observable исключительно до тех пор, пока он не завершится до того, как он начнет подписываться на следующий Observable. Наблюдения, которые появляются до завершения текущих наблюдений, будут удалены и не будут распространяться.

ОБНОВЛЕНИЕ

Глядя на исходный код (https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js) кажется, что в то время как ток наблюдаемой не завершена, все входящие наблюдаемые в то же время будет отброшен, т.е. не подписаны.

Так что если подписка на эти наблюдаемые триггеры вызывает HTTP-вызов (было бы интересно увидеть код для httpRestService), то нет ненужного http-вызова. Если эти вызовы запускаются немедленно, вызывая функцию, и результат передается через наблюдаемый, то есть вероятность того, что эти вызовы действительно вызваны без необходимости. В этом случае эта проблема легко разрешима с использованием оператора defer для выполнения http-вызова только во время подписки. Короче говоря, вам нужно ленивое выполнение остального запроса, если у вас его еще нет.

+0

Буду рад узнать, что не так с предлагаемым решением, поскольку я наблюдаю, что оно было приостановлено. – user3743222

+0

Это прекрасно. Спасибо! – Harangue

+1

Вы уверены, что это дает то, что вы хотите? Если я не ошибаюсь, это все равно вызовет вызов httpRestService для каждого события документа, он просто отбросит все результаты до тех пор, пока предыдущий вызов не вернется. –

Смежные вопросы