rxjs操作符应该返回函数还是可观察的?

rxjs操作符应该返回函数还是可观察的?,rxjs,observable,operators,reactivex,Rxjs,Observable,Operators,Reactivex,rxjs中运算符的各种定义让我有点困惑 下面我提供了一些定义: Pipeable操作符是一个函数,它将一个可观察对象作为其输入,返回另一个可观察对象 创建操作符是另一种操作符,可以作为独立函数调用,以创建新的可观察操作符 运算符是一个函数,它将一个可观察对象(源)作为其第一个参数,返回另一个可观察对象(目标或外部可观察对象) 运算符接受配置选项,并返回一个函数,该函数接受可观察的源 运算符应始终返回可观察的[…]如果您创建的方法返回的不是可观察的,它不是运算符,这很好 因为1,2,4似乎与3相冲

rxjs中运算符的各种定义让我有点困惑

下面我提供了一些定义:

Pipeable操作符
是一个函数,它将一个可观察对象作为其输入,返回另一个可观察对象
创建操作符
是另一种操作符,可以作为独立函数调用,以创建新的可观察操作符

运算符是一个函数,它将一个可观察对象(源)作为其第一个参数,返回另一个可观察对象(目标或外部可观察对象)

运算符接受配置选项,并返回一个函数,该函数接受可观察的源

运算符应始终返回可观察的[…]如果您创建的方法返回的不是可观察的,它不是运算符,这很好

因为1,2,4似乎与3相冲突,哪个定义是正确的。rxjs操作符有更好的定义吗

例如:如果是
映射
map()
本身就是操作员吗?或者运算符是map()的返回值

map()本身就是运算符吗?或者运算符是map()的返回值

当前的实现如下所示:

导出函数映射(项目:(值:T,索引:number)=>R,thisArg?:any):运算符函数{
返回函数映射操作(来源:可观察):可观察{
if(项目类型!==‘功能’){
throw new TypeError('参数不是函数。是否正在查找'mapTo()`?');
}
返回source.lift(新映射操作符(项目,thisArg));
};
}
因此,
map()
是一个函数。它是RxJS术语中的一个操作符,是的,但它仍然是一个常规JavaScript函数。就这样

此运算符接收
project
ion回调函数,该函数由
map
运算符调用。此回调是传递给
map()
,例如本例中的
value=>value.id

source$.pipe(映射(value=>value.id))
映射的返回值也是一个函数(声明为)。可以看出它是一个函数,因为
map
return
s
函数映射操作()

现在,
mapOperation
函数只接收一个参数:
source
类型为
Observable
,并返回另一个(转换后的)
Observable

总之,当你说:

可管道操作符是一个函数,它将一个可观察对象作为输入并返回另一个可观察对象

这意味着当RxJS操作符(它是一个函数)将一个可观察对象作为其输入并返回另一个可观察对象(在我们的例子中为true)时,它是可管道化的:一个
map
操作符确实返回了一个函数(
mapOperation
),该函数的签名(
(源代码:observeable):observeable
)准确地表示:它获取一个可观察对象并返回另一个

运算符是一个函数,它将一个可观察对象(源)作为其第一个参数,并返回另一个可观察对象(目标或外部可观察对象)

我已经多次提到操作符是一个函数

运算符接受配置选项,并返回一个函数,该函数接受可观察的源

是的,在这种情况下,可以调用
map()
操作符,因为它接收配置选项-a
project
tion回调函数。因此,这里实际上没有冲突,因为许多操作符都是可配置的

我要说的是,这其中有冲突:

操作符应该总是返回一个可观察的[…]如果你创建了一个方法,它返回的不是可观察的东西,它不是操作符,这很好

我猜这是一个古老的定义,当可管道操作符不可管道时。在引入可管道操作符之前(我认为在RxJS的第5版中),操作符返回的是可观测值。旧的实现正好表明了这一点

有关RxJS的创建者为什么决定引入可管道操作符的更多信息,请参阅

另一篇关于什么是可观测的伟大文章可以找到

此外:

创建操作符是另一种操作符,可以作为独立函数调用,以创建新的可观察对象

是返回(创建)可观察对象的创建运算符的示例。请看一下源代码

TL;DR:A
map()
是一个通常具有一个参数(投影回调函数)的函数,该参数还返回一个函数,该函数接收源可观测值并返回目标可观测值

编辑:要从评论中回答您的问题,我想在这里回答

是的,在RxJS 6中,您可以创建一个接受observable并返回另一个函数的函数,该函数就是操作符。例如

function myOperatorFunction(s:Observable。这是为了与大多数具有某些参数的其他运算符一致,因此您不必记住哪些运算符没有收到参数,哪些运算符具有默认参数(如
min()
)。在
refCount
的情况下,如果编写的内容与现在稍有不同,则可以编写

source$.pipe(refCountOperatorFunction);
而不是

source$.pipe(refCount());
但是你必须知道你必须这样写,这就是为什么函数被用来返回函数的原因(它接收可观察的并返回另一个可观察的)

编辑2:既然您知道内置运算符返回函数,您可以通过传入源可观测来调用它们

map(value=>value.toString())(of())
Bu
const squareValues = map((val: number) => val * val);
const squaredNums = squareValues(nums);