Задать вопрос
@Mariik

RxJs — как добавить условный оператор в поток?

Привет.
Пытаюсь переписать этот блок кода с промисов на Observable и столкнулся с тем, что я не особо понимаю как именно делать условия.
return new Promise((resolve) => {
       if (this.userService.isAuthenticate()) { 
        if (!this.permissionService.isPermissionForRoute(state.url);) {
           const mainUrl = this.permissionService.getMainRoute();
           this.router.navigateByUrl(mainUrl);
          return resolve(false);
        } else {
          return resolve(true);
         }
       } if (state.url === '/auth/login' || this.permissionService.isPublicRoute(state.url) ) {
        resolve(true);
      } else {
         this.router.navigateByUrl('/auth/login');
         resolve(false);
       }
     });
  • Вопрос задан
  • 462 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@itPiligrim
Front-end разработчик + 1С
rxjs не создан для замены всего кода. Его смысл в том, что "все на свете" можно представить единообразно в виде потоков, а потом их комбинировать, изменять, подписывать на них и т.п. Думайте о том, какие потоки Вам нужны.

В данном коде плохо то, что внутри промиса вызывается navigateByUrl. Это неправильно. Вы создаете поток, но при этом внутри него делаете что-то непонятное, чуждое этому потоку. Задача потока только эмитеть значения. Следует убрать сторонние вызовы. Надо сделать чистый промис, задача которого вернуть нечто, что позволит потом принять какие-то решения по навигации и т.п. Сам промис можно сконвертировать в Observable через FromPromise или сразу оформить через Observable. Это уже не суть. Промис - это тоже поток, только немного в другом формате, поэтому нет смысла ставить задачу переписать промис в Observable. Это тоже самое, как заменять let на const. Да, красивее, но смысл почти не меняется.

Поэтому просто сделайте промис чистым, а переход вынесите наружу.
Ответ написан
Комментировать
Для фильтрации потока используется оператор filter
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы