startWith
происходит после того, как вы отфильтровали свое содержимое.
of(1).pipe( // will yield (1)
filter(_ => false), // will yield ()
startWith('hello') // will yield ('hello')
).susbcribe(val => console.log(val));
Итак, поток, состоящий из 1
, отфильтрован, чтобы ничего не пропустить вещь сама по себе .Затем эта вещь «украшается» оператором startWith
, что дает ей начальный hello
.
Этот новый поток - тот, на который вы подписаны!
Это действительно предназначено
Пусть startWith
будет выше filter
в аргументах pipe(...)
, и вы увидите, как это изменится:
of(1).pipe( // will yield (1)
startWith('hello'), // will yield ('hello', 1)
filter(_ => false) // will yield ()
).susbcribe(val => console.log(val));
Для решения проблем вВ разделе комментариев вы можете представить цепочку pipe
как nested calls
.Например, в псевдокоде:
A.pipe(B, C, D)
... эквивалентно выполнению:
D(C(B(A)))
Таким образом, следующее:
of(1).pipe( // expression A
filter(_ => false), // expression B
startWith('hello') // expression C
).susbcribe(val => console.log(val));
..будет переводиться в:
startWith( // expression C
filter( // expression B
of(1), // expression A
_ => false
),
'hello'
).susbcribe(val => console.log(val))
Или, более "императивным" способом:
const one = of(1);
const filtered = filter(one, _ => false);
const greeted = startWith(filtered, 'hello');
greeted.subscribe(val => console.log(val));
Тогда становится ясно, что фильтр может не влиять на операторовдальше по цепочке!