Если вы делаете только один запрос , то не имеет значения какую карту вы используете.
mergeMap (также называемый flatMap), concatMap, выхлопная карта или 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-----
Выхлопная карта
похоже на перевернутую карту switchMap, она отдает приоритет выводу:
Src : -----A--------B----C-D---E-----------
exhaustMap (x => x--x--x) // emit x twice 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
);
})
)
};