Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rxjs中的flatMap、mergeMap、switchMap和concatMap?_Rxjs_Observable - Fatal编程技术网

rxjs中的flatMap、mergeMap、switchMap和concatMap?

rxjs中的flatMap、mergeMap、switchMap和concatMap?,rxjs,observable,Rxjs,Observable,有人,请解释一下SwitchMap和FlatMap在Javascript方面的区别(在角度透视图中,rxjs 5) 据我理解 SwitchMap仅发出最新的可观察值,并取消先前的可观察值 flatMap收集所有单个可观测数据,并返回单个数组中的所有可观测数据,而不考虑可观测数据的顺序。异步工作 concatMap保持秩序并发出所有可观察值,同步工作 是这样吗 mergeMap与上面的工作方式有什么不同 有人,请举例说明。至少对我来说,这在开始时有点难理解 不管怎样,考虑一下: flatMap是m

有人,请解释一下SwitchMap和FlatMap在Javascript方面的区别(在角度透视图中,rxjs 5)

据我理解

SwitchMap仅发出最新的可观察值,并取消先前的可观察值

flatMap收集所有单个可观测数据,并返回单个数组中的所有可观测数据,而不考虑可观测数据的顺序。异步工作

concatMap保持秩序并发出所有可观察值,同步工作

是这样吗

mergeMap与上面的工作方式有什么不同


有人,请举例说明。

至少对我来说,这在开始时有点难理解

不管怎样,考虑一下:

flatMap
mergeMap
-
mergeMap
方法的另一个名称,它接受一个可选参数
concurrency
,该参数定义了可以同时订阅多少个观察对象

concatMap
等于
mergeMap
,并发设置为1

使用
mergeMap
您不会丢失您在回答中建议的正在合并的观察对象发出的任何事件

switchMap
的工作原理与您描述的一样(有关更多详细信息,请参阅这篇漂亮的文章)

从一个:

  • flatMap/mergeMap-立即为任何源项创建一个可观察项,所有以前的可观察项保持活动状态
  • concatMap-在创建下一个可观察对象之前,等待上一个可观察对象完成
  • 开关映射-对于任何源项,完成上一个可观察项并立即创建下一个可观察项
  • 排气量图-当前一个可观察项未完成时,忽略源项
下面是一个示例,说明了当源为立即项(0,1,2,3,4)且映射函数创建一个可观测项时,每个操作符的行为方式,该项可观测项将延迟500毫秒:

const{mergeMap,flatMap,concatMap,switchMap,defaustmap}=Rx.operators;
常量示例=运算符=>()=>
从([0,1,2,3,4])可以观察到的Rx
.烟斗(
操作员(x=>Rx.可观察到的(x).延迟(500))
)
.subscribe(console.log,()=>{},()=>console.log(`${operator.name}completed`));
常数mm=示例(合并映射);
常数fm=示例(平面图);
常数cm=示例(concatMap);
常量sm=示例(开关映射);
常数em=示例(排气图)
.examples>div{
光标:指针;
背景色:#4CAF50;
颜色:白色;
填充:7px 16px;
显示:内联块;
}

合并地图
平面图
海图
开关图
排气图

@ZahiC,回答很酷-我喜欢在代码示例中使用函数组合。如果可以的话,我想借用它来说明几个额外的点使用定时观测

外部、内部和控制 这些操作符都类似于
map()
,它们的共同特点是具有外部内部可观察。关键的区别在于外部可观察对象控制内部可观察对象的方式

为了对比它们,我的代码示例成对运行它们,以
[outerValue,innerValue]
的形式输出值。我在测试中添加了间隔,并更改了内部延迟,以便在计时上有一些重叠(使用的公式是
延迟((5-x)*200)


mergeMap与concatMap 这两种方法都输出所有值,区别在于顺序

mergeMap-按内部可观察的顺序
[0,0]、[1,0]、[0,1]、[2,0]、[1,1]、[3,0]、[2,1]、[4,0]、[3,1]、[4,1]

concatMap-外部可观测的顺序
[0,0]、[0,1]、[1,0]、[1,1]、[2,0]、[2,1]、[3,0]、[3,1]、[4,0]、[4,1]

从输出中,可以在序列中延迟mergeMap外部发射,但concatMap遵循严格的外部发射序列。


切换地图与排气地图 这两个控制输出

开关图-按最后一次节流
[3,0],[4,0],[4,1]

排气MAP-第一节节气门
[0,0],[0,1],[4,0],[4,1]

从输出中,switchMap对任何未完成的内部排放进行节流,但在排放之后的排放进行节流,直到较早的排放完成。


mergeMap与switchMap 我把这个放进去是因为switchmap经常用于真正应该使用mergeMap的答案中

mergeMap-按内部可观察的顺序
[0,0]、[1,0]、[0,1]、[2,0]、[1,1]、[3,0]、[2,1]、[4,0]、[3,1]、[4,1]

开关图-按最后一次节流
[3,0],[4,0],[4,1]

主要结论是,switchMap输出是不可预测的,这取决于内部可观测的时间,例如,如果内部是一个http get,则结果可能取决于连接速度。


console.clear()
const{mergeMap、flatMap、concatMap、switchMap、defaustmap、delay、map、take、toArray}=Rx.operators;
常量注释={
mergeMap:“按内部可观察对象排序”,
concatMap:“外部可观测的顺序”,
switchMap:'最后一个节气门',
排气图:“第一节气门开度”,
}
常量标题=(运算符)=>{
const opName=operator.name.replace('$1','')
返回`${opName}-${note[opName]}`
}
常数显示=(x)=>{
返回映射(y=>`[${x},${y}]`)
}
常数内部=(x)=>Rx.可观察计时器(0500)
.烟斗(
延迟((5-x)*200),
显示器(x),
采取(2)
)
常量示例=运算符=>()=>{
Rx.可观测间隔(500).取(5)
.烟斗(
运算符(x=>内部(x)),
toArray(),
映射(VAL=>VAL.join(','))
)
.订阅(x=>{
控制台日志(标题(操作员))
console.log(x)
});
};
常量运行=(fn1,fn2)=>{
控制台清除()
fn1()
fn2()
}
常量mmVcm=()=>run(示例(mergeMap),示例(concatMap));
const smVem=()=>run(示例(开关映射),示例(排气映射));
常量mmVsm=()=
Input: a,b,c,d

Output: A, B, C, D
Input: a,b,c,d

Output: animal, aardvark, bull, baker, beach, cow, dog, day, dinner
Input: a,b,c,d

Output: animal, aardvark, axe, bull, baker, beach, cow, car, cat, dog, day, dinner
Input: a,b,c,d

Output: animal, aardvark, axe, cow, car, cat
Input: a,b,c,d

Output: animal, aardvark, bull, axe, baker, cow, car, beach, dog, day, cat, dinner