хороший вопрос, теперь давайте углубимся в объяснение.
Сначала давайте посмотрим на решение
function test(limitter) {
return function(source) {
return new Observable(observer => {
return source.subscribe({
next(value) {
observer.next(value);
},
error(error) {
observer.error(error);
},
complete() {
console.log("completed action");
observer.complete("completed value");
}
});
});
};
}
interval(1000)
.pipe(
take(2),
test()
)
.subscribe(
x => {
console.log("result: ", x);
},
err => {
console.log(err);
},
end => {
console.log("Observable has been completed");
}
);
Так в чем же разница, в этом фрагменте оператор take
предшествует пользовательскому оператору test()
, что означает, что всякий раз, когда мы достигаем желаемого количества (в нашемВ случае 2
) оператор take
вернет завершенный источник , что вызовет наш полный метод внутри последующих подписчиков (в нашем случае внутри пользовательского оператора test
, а также внутри subscribe
) после этого source
больше не будет излучать ничего, потому что оно уже завершено.
Вы можете проверить источник => take () , для получения дополнительной информации не стесняйтесьспросить что-нибудь, если есть какие-то размытые части.