Kon*_*ten 4 javascript rxjs typescript
我正在阅读文档mapTo,但我根本不明白该运算符存在的意义。我明白它的作用,但下面的两行应该产生相同的结果。
const outcome = "bzzz";
const result1 = source.map(a => outcome);
const result2 = source.mapTo(outcome);
Run Code Online (Sandbox Code Playgroud)
然而,RxJ 的创建者选择通过添加额外的方法来增加复杂性。这看起来毫无意义,所以我怀疑它的内容比表面上看到的更多。
对于这种特定情况,有专门的操作员有什么意义呢?
map和之间的区别mapTo乍一看,我们可以看到map接受一个回调函数
function map<T, R>(project: (value: T, index: number) => R, thisArg?: any)
Run Code Online (Sandbox Code Playgroud)
而mapTo接受静态值
function mapTo<R>(value: R)
Run Code Online (Sandbox Code Playgroud)
因此,一个明显的区别是 的map回调函数可以根据提供的参数生成一个值。的情况并非如此mapTo,您只需提供一个值,该值将始终传递给链中的下一个订阅者。如果你愿意,mapTo(value)可以认为是
map(() => value)
Run Code Online (Sandbox Code Playgroud)
我们也可以从源代码中推断出这一点:
// `mapTo`
() => subscriber.next(value)
// `map`; `project` is the provided callback function
() => subscriber.next(project.call(thisArg, value, index++));
Run Code Online (Sandbox Code Playgroud)
但您可能不想这样做,当您可以直接使用值时为什么要调用函数呢?
一个用例可能是当您有 NgRx 效果并且您希望在发生某些情况时返回相同的非动态操作。
createEffect(
() => this.actions.pipe(
/* some logic here... */
mapTo(staticAction('a message here')),
)
);
Run Code Online (Sandbox Code Playgroud)
另一种可能看起来不太实用的情况是,当您想要模拟一些传入的请求时:
merge(
timer(300).pipe(mapTo("req#1")),
timer(600).pipe(mapTo("req#2")),
timer(100).pipe(mapTo("req#3")),
timer(900).pipe(mapTo("req#4")),
).pipe(
/* some complicated logic here... */
)
Run Code Online (Sandbox Code Playgroud)
不管怎样,至少从我的角度来看,这个运算符的目的是表明您想要传递静态值,即不依赖于先前订阅者的数据的值。
mapTo实际上只是为特定映射场景提供便利,其中:
第二点需要注意,因为如果目标值随时间变化,map(a => target)和之间的输出将会存在差异mapTo(target):
map(a => outcome)- 将返回“结果”的当前值(可能有不同的结果)mapTo(outcome)- 将返回“结果”的第一个发出值(每次结果相同)let outcome = 0;
// change 'outcome' every second
interval(1000).pipe(tap(n => outcome = n * 2)).subscribe();
const source = interval(1000).pipe(take(4));
source.pipe(map(a => outcome)); // 0, 2, 4, 6
source.pipe(mapTo(outcome)); // 0, 0, 0, 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3411 次 |
| 最近记录: |