2016-12-06 1 views
1

Использование RxJS 5, возможно ли это?Можно ли остановить Rx.Subject от излучения внутри абонента, например event.stopPropagation?

var source = new Rx.Subject(); 

source.map((data) => {console.log('map1'); return data;}) 
    .subscribe((data) => { 
     console.log('subscribe1', data); 
     if(someCondition) { 
      source.stop(); //???????? 
     } 
    }); 

source.map((data) => {console.log('map2'); return data;}) 
    .subscribe((data) => { 
     console.log('subscribe2', data); 
    }); 

Так что, когда я называю source.next("Hello World"); только первый абонент будет уведомлен. Конечно, это не сработает в source.stop(), потому что функции stop не существует, но это просто вопрос моего вопроса.

Есть способ сделать это, например event.stopPropagation do?

ответ

2

Это зависит от того, что вы ожидаете, прекратив распространение. Вы можете позвонить source.complete(), который остановит объект, и он больше ничего не испустит.

См демо: https://jsbin.com/geyucuc/3/edit?js,console

Однако, если вы хотите, чтобы иметь возможность работать на «за единицу основе» вы можете не структура у вас есть прямо сейчас, потому что каждое значение из source испускается как своим абонентам Субъект.

У вас нет цепи, где значение имеет значение source =>subscribe1 =>subscribe2.

Сейчас у вас есть source =>subscribe1, а затем source =>subscribe2.

Таким образом, вы можете сделать это цепь, как это, например:

var source = new Rx.Subject(); 

source 
    .map(item => { // wrap this 
     return { value: item, stopped: false }; 
    }) 
    // your logic 
    .map((data) => { 
     console.log('map1', data.value); 
     // do whatever here 
     if (data.value == 2) { 
      data.stopped = true; 
     } 
     return data; 
    }) 
    .filter(item => !item.stopped) // this is your stopPropagation() 
    .map((data) => { 
     // do whatever here 
     console.log('map2', data.value); 
     return data; 
    }) 
    .subscribe((data) => { 
     // do nothing here, just construct the chain. 
    }); 

source.next(1); 
source.next(2); 

который печатает следующее:

map1 1 
map2 1 
map1 2 
+0

Теперь я получаю изображение правильно. Итак, если 'filter' возвращает' false', следующая карта не будет вызываться? –

+0

Я знаю, что вы объясните, что у меня нет цепи, но подписчики работают в том же порядке, что и подписываются, не делают ее цепочкой? RxJS должен предоставить способ сказать: «эй, не испускай больше». Или это выходит из схемы Observable? –

+0

@CastroRoy Я бы стал цепочкой, если 'source' отправил элемент в' subscribe1', затем 'subscribe1' отправил его в' subscribe2'. Таким образом, 'subscribe1' имеет контроль над значением, которое он отправляет. Он может изменить его, а не отправлять его вообще. С другой стороны, когда у вас есть «источник» и два подписчика, они получают значение независимо друг от друга. Если 'filter()' return false, то значение не распространяется на последующий oeprator. – martin