gpt4 book ai didi

javascript - 运算符管道是否创建类似于过滤器、映射、减少创建中间数组的中间可观察对象?

转载 作者:行者123 更新时间:2023-12-01 17:18:24 24 4
gpt4 key购买 nike

我需要澄清 RxJS 中运算符管道的效率。

我目前对 RxJS 中运算符管道的了解是,管道内的每个运算符都会接收一个可观察对象并创建一个新的(可能经过修改的)可观察对象,该可观察对象作为输入返回给下一个运算符。此行为类似于 JavaScript 过滤器、映射、缩减行为。从而使原始可观察对象(流)或数组保持不变/纯净。

RxJS 文档支持此假设:https://rxjs-dev.firebaseapp.com/guide/operators

A Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable stays unmodified.

考虑到较长的运算符(operator)管道,创建中间可观察对象对我来说似乎有点昂贵。

此外,我正在阅读 Sergi Mansilla 撰写的《使用 RxJS 5 进行响应式编程》一书。我知道 RxJS 目前是 6.5.3 版本,但我希望基 native 制从那时起没有改变。

书中有一节关于管道的效率,它说可观察的管道不会创建中间的可观察对象。相反,他们一次将所有操作应用于每个元素。这是有道理的,因为运算符 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

是否有任何中间 observables 正在这个操作管道中创建?或者只是完整的管道创建了一个新的 observable 而 numberStream 保持不变?或者到底是怎么回事?

最佳答案

通过研究如何创建自定义运算符以传入 pipe()

source=>source.pipe(...) 

它期望的是一个函数,该函数通过可选地修改/附加/应用源可观察量的更多操作来返回可观察量。我想这不是立即可以观察到的,因为在管道的尽头你只会有一个来源通过。

关于javascript - 运算符管道是否创建类似于过滤器、映射、减少创建中间数组的中间可观察对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60402060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com