Angular 5个RxJs concatMap,switchMap,mergeMap哪个?
Angular 5 RxJs concatMap,switchMap,mergeMap which?
我有这个方法可以通过本地存储获取令牌,如果令牌不存在或过期,我会调用API获取另一个令牌并存储到本地存储。
在这种情况下,我应该使用哪个地图,目前使用的是 mergeMap,还是其他方式?
public doGetToken():Observable<Token> {
return this.loadToken().pipe( //get via localstorage
map(token=>{
let valid = this.validateTokenIsValid(token);
let data = {
token: token,
valid: valid
};
return data;
}),
mergeMap(data=>{
if (!data.valid) {
return this.doApiGetToken(data.token).pipe(
map(
token=>{
this.saveToken(token); //save to localstorage
return token;
}
)
);
} else {
return of(data.token);
}
})
);
版本:Angular5,rxjs5
提前谢谢你。
如果您只提出一个请求,那么使用哪个地图都没有关系。
mergeMap(也称为 flatMap)、concatMap、exhaustMap 或 switchMap 的行为相同。
当您发出超过 1 个值时,这些运算符的行为会有所不同:
switchMap
会将映射应用到收到的最新输入:
Src : -----A----B----C--D-E-------
switchMap (x => x--x) // emit x twice when received
Out: ------A--A-B--B-C-D-E--E----
concatMap
将在接受另一个输入之前完成映射:
Src : -----A----B----C--D-E-----------
concatMap (x => x--x) // emit x twice when received
Out: ------A--A-B--B-C--C--D--D-E--E
mergeMap
类似于concatMap,但它不等待映射完成。结果可能会重叠:
Src : -----A----B----C-D---E-----------
mergeMap (x => x--x) // emit x twice when received
Out: ------A--A-B--B-C-D-C-D-E--E-----
exhaustMap
就像一个反转的switchMap,它优先输出:
Src : -----A--------B----C-D---E-----------
exhaustMap (x => x--x--x) // emit x thrice when received
Out: ------A--A--A--B--B--B-D--D--D-------
更多信息:
https://medium.com/@vdsabev/the-simple-difference-between-rxjs-switchmap-and-mergemap-397c311552a5
大理石图:
http://rxmarbles.com/#mergeMap
编辑:我将您的代码的简化移到了底部,以使一般信息一目了然。
public doGetToken(): Observable<Token> {
return this.loadToken()
.pipe( //get via localstorage
mergeMap(token => {
if(!this.validateTokenIsValid(token))
return of(token)
return this.doApiGetToken(token)
.pipe(
tap( token => this.saveToken(token)) //save to localstorage
);
})
)
};
上述运算符的单源可观察量没有区别。
switchMap: 发出值并且只对它发送的最后一个值感兴趣。之前调用的所有响应都被忽略。
concatMap: 表现得像一个队列:它存储所有调用并一个接一个地发送。一个完成了,正在处理下一个。
mergeMap: 也发送所有请求,如 concatMap 但不等到响应返回。它在他们来的时候把他们送出去。但它会收到所有回复并且不会忽略任何内容。这里的顺序不保证。
exhaustMap: 发出第一个请求并忽略所有未来的请求,直到第一个请求返回。然后准备换一个新的。
请参考此link。真的很棒
我有这个方法可以通过本地存储获取令牌,如果令牌不存在或过期,我会调用API获取另一个令牌并存储到本地存储。
在这种情况下,我应该使用哪个地图,目前使用的是 mergeMap,还是其他方式?
public doGetToken():Observable<Token> {
return this.loadToken().pipe( //get via localstorage
map(token=>{
let valid = this.validateTokenIsValid(token);
let data = {
token: token,
valid: valid
};
return data;
}),
mergeMap(data=>{
if (!data.valid) {
return this.doApiGetToken(data.token).pipe(
map(
token=>{
this.saveToken(token); //save to localstorage
return token;
}
)
);
} else {
return of(data.token);
}
})
);
版本:Angular5,rxjs5
提前谢谢你。
如果您只提出一个请求,那么使用哪个地图都没有关系。
mergeMap(也称为 flatMap)、concatMap、exhaustMap 或 switchMap 的行为相同。
当您发出超过 1 个值时,这些运算符的行为会有所不同:
switchMap
会将映射应用到收到的最新输入:
Src : -----A----B----C--D-E-------
switchMap (x => x--x) // emit x twice when received
Out: ------A--A-B--B-C-D-E--E----
concatMap
将在接受另一个输入之前完成映射:
Src : -----A----B----C--D-E-----------
concatMap (x => x--x) // emit x twice when received
Out: ------A--A-B--B-C--C--D--D-E--E
mergeMap
类似于concatMap,但它不等待映射完成。结果可能会重叠:
Src : -----A----B----C-D---E-----------
mergeMap (x => x--x) // emit x twice when received
Out: ------A--A-B--B-C-D-C-D-E--E-----
exhaustMap
就像一个反转的switchMap,它优先输出:
Src : -----A--------B----C-D---E-----------
exhaustMap (x => x--x--x) // emit x thrice when received
Out: ------A--A--A--B--B--B-D--D--D-------
更多信息:
https://medium.com/@vdsabev/the-simple-difference-between-rxjs-switchmap-and-mergemap-397c311552a5
大理石图:
http://rxmarbles.com/#mergeMap
编辑:我将您的代码的简化移到了底部,以使一般信息一目了然。
public doGetToken(): Observable<Token> {
return this.loadToken()
.pipe( //get via localstorage
mergeMap(token => {
if(!this.validateTokenIsValid(token))
return of(token)
return this.doApiGetToken(token)
.pipe(
tap( token => this.saveToken(token)) //save to localstorage
);
})
)
};
上述运算符的单源可观察量没有区别。
switchMap: 发出值并且只对它发送的最后一个值感兴趣。之前调用的所有响应都被忽略。
concatMap: 表现得像一个队列:它存储所有调用并一个接一个地发送。一个完成了,正在处理下一个。
mergeMap: 也发送所有请求,如 concatMap 但不等到响应返回。它在他们来的时候把他们送出去。但它会收到所有回复并且不会忽略任何内容。这里的顺序不保证。
exhaustMap: 发出第一个请求并忽略所有未来的请求,直到第一个请求返回。然后准备换一个新的。
请参考此link。真的很棒