У меня проблема с особыми потребностями производителя в RxJS: производитель медленно производит элементы. Потребитель запрашивает элементы и часто должен ждать производителя. Это может быть достигнуто путем смены производителя и потока запросов:RxJS: Продюсер-потребитель с прерыванием
var produce = getProduceStream();
var request = getRequestStream();
var consume = Rx.Observable.zipArray(produce, request).pluck(0);
Иногда запрос прерывается. Производимый элемент должен потребляться только после того, как не несостоявшегося запроса:
produce: -------------p1-------------------------p2--------->
request: --r1--------------r2---------------r3-------------->
abort: ------a(r1)------------------a(?)------------------>
consume: ------------------c(p1, r2)-------------c(p2, r3)-->
Первый запрос r1
будет потреблять первый произведенный элемент p1
, но r1
получает прерван a(r1)
прежде чем он может потреблять p1
. p1
производится и потребляется c(p1, r2)
по второму запросу r2
. Второе прерывание a(?)
игнорируется, поскольку ранее не было запрошено неотвеченный запрос. Третий запрос r3
должен подождать следующего изготовленного элемента p2
и не прерывается до p2
. Таким образом, p2
потребляется c(p2, r3)
сразу же после его изготовления.
Как добиться этого в RxJS?
Edit: Я создал example с тестом QUnit на jsbin. Вы можете отредактировать функцию createConsume(produce, request, abort)
, чтобы попробовать/протестировать ваше решение.
В примере содержится определение функции previously accepted answer.
Хорошая проблема. [Здесь] (http://jsbin.com/havoroniqi/3/edit) - моя попытка, но @ Брэндон лучше. –
КПП. Я заметил некоторые небольшие проблемы с вашими тестами: 1. вы создаете '1',' 2', но ждите: 'p1',' p2'; 2. Вы когда-то меняли «ожидаемые» и «фактические». –
Прошу прощения. Я строю этот тест в спешке и поделился примером jsbin неправильным способом. Таким образом, я случайно изменил его позже во время моих собственных подходов. Я изменил элементы на их исходные значения: произведите: 'p1' и' p2'; request: 'r1',' r2' и 'r3'; abort: 'a1'. – maiermic