Мне нужны разъяснения об эффективности конвейеров операторов в Rx JS.
Насколько мне известно о конвейере операторов в Rx JS, каждый оператор внутри конвейера получает наблюдаемый и создает новую (возможно модифицированную) наблюдаемую, которая возвращается в качестве следующего оператора. Такое поведение было бы похоже на JavaScript фильтр, отображение, уменьшить поведение. Таким образом, оставляя исходный наблюдаемый (поток) или массив нетронутым / чистым.
Это предположение поддерживается Документацией Rx JS по адресу: https://rxjs-dev.firebaseapp.com/guide/operators
Pipeable Operator - это функция, которая принимает Observable в качестве входных данных и возвращает другое Observable. Это чистая операция: предыдущая наблюдаемая остается неизменной.
Учитывая длинные конвейеры операторов, создание промежуточных наблюдаемых мне кажется довольно дорогим.
Кроме того, я читаю книгу «Реактивное программирование с использованием Rx JS 5», написанное Sergi Mansilla. Я знаю, что Rx JS в настоящее время имеет версию 6.5.3, но я ожидаю, что механизм basi c с тех пор не изменился.
В книге есть раздел об эффективности конвейера, в котором говорится что наблюдаемые трубопроводы не создают промежуточных наблюдаемых. Вместо этого они применяют все операции к каждому элементу в одном go. Это имеет смысл, поскольку оператор take (amount) завершает наблюдаемый поток после получения первых amount элементов. Это также объясняет ленивую оценку , пересекающую исходный наблюдаемый поток только один раз при максимуме или до тех пор, пока не будет выполнено условие take .
import * as rxCore from 'https://dev.jspm.io/rxjs@6/_esm2015/index';
import * as rxOps from 'https://dev.jspm.io/rxjs@6/_esm2015/operators';
const numberStream = rxCore.range(0, 10);
numberStream.pipe(
rxOps.map(number => number * number), //creates Observable with [0,1,4,9,16,25,36,49,64,81]
rxOps.filter(number => number % 2 === 0), //creates Observable with [0,4,16,36,64]
rxOps.take(3) //completes after [0,4,16]
).subscribe(console.log); //logs 0, 4, 16
Есть ли какие-либо промежуточные наблюдаемые, создаваемые внутри этого конвейера операторов? Или только полный конвейер создает одну новую наблюдаемую область, оставляя numberStream нетронутым? Или в чем именно дело?