Я пытаюсь понять, в чем разница между этими двумя наблюдаемыми. Единственная разница в коде заключается в следующем:
/**
* Inside rxjs pipe
*/
if(typeof x === 'number' && x > 3) {
return of(x);
} else {
return EMPTY;
}
vs:
.filter(typeof x === 'number' && x > 3)
Тест, который я провожу:
const a$ = from([1, 6, '4']).pipe(
tap(console.log),
flatMap((x) => {
if (typeof x === 'number') {
if (x > 3) {
return of(x);
}
return EMPTY;
}
return EMPTY;
}),
tap(console.log)
);
const sub_a = a$.subscribe(
(x) => { console.log(x, 'success'); done(); },
(e) => { console.log(e, 'error'); done(); },
() => { console.log('complete'); sub_a.unsubscribe(); done(); }
);
а также:
const b$ = from([2, 5, '8']).pipe(
tap(console.log),
filter(x => typeof x === 'number' && x > 3),
tap(console.log)
);
const sub_b = b$.subscribe(
(x) => { console.log(x, 'success'); done(); },
(e) => { console.log(e, 'error'); done(); },
() => { console.log('complete'); sub_b.unsubscribe(); done(); }
);
для них обоих я получаю первое значение, зарегистрированное один раз (перед фильтром / flatMap), второе значение, зарегистрированное дважды с касаний, один раз с «завершением», а третье - один раз.
Я думал, что разница будет в том, что испускание EMPTY
приведет к полному закрытию наблюдаемого, но последующие значения по-прежнему будут видны через канал.
Я проделал то же самое с Subject
, с той лишь разницей, что Subject
s не испускали Complete
, чего и следовало ожидать.
of
завершается после передачи предоставленных значений,EMPTY
завершается без передачи каких-либо значений. Это не обязательно означает, что потребитель тоже должен завершить. - person jonrsharpe   schedule 28.08.2019filter
иflatMap
переходом вEMPTY
. - person Ran Lottem   schedule 28.08.2019flatMap
pingEMPTY
(или, если на то пошло,of
) не заставит завершиться и внешнее наблюдаемое. И почему вы с самого начала искали переопределениеfilter
? - person jonrsharpe   schedule 28.08.2019flatMap
вEMPTY
, и хотел заменить его наfilter
, но не был уверен, что это точно сохранит функциональность. - person Ran Lottem   schedule 28.08.2019flatMap
, имеет другой планировщик, но в вашем примере видимое поведение должно быть таким же - person Oles Savluk   schedule 28.08.2019