Angular 5 RxJs concatMap, switchMap, mergeMap который? - PullRequest
0 голосов
/ 04 июля 2018

У меня есть этот метод для получения токена через localstorage, если токен не существует или срок его действия истек, я позвоню API, чтобы получить другой токен и сохранить его в localstorage.

В этом случае какую карту я должен использовать, в настоящее время используется 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);
        }
      })
    );

версия: угловая 5, rxjs5

Заранее спасибо.

1 Ответ

0 голосов
/ 04 июля 2018

Если вы делаете только один запрос , то не имеет значения какую карту вы используете.

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
          );
      })
    )
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...