Javascript RxJS как отписаться от метода сервиса - PullRequest
0 голосов
/ 28 января 2019

У меня есть функция, которая выполняется после нажатия кнопки.

async executeAction(action: Action) {
    const proceedingReturnView = this.getCurrentView();
    this.srv.execute(action, proceedingReturnView);
  }

  public getCurrentView(): ViewData {
    console.log('I am here 1');
    const paramMap = this.activatedRoute.snapshot.paramMap;
    const queryParamMap = this.activatedRoute.snapshot.queryParamMap;
    return ProceedingViewComponent.getCurrentView(paramMap, queryParamMap, 'PODSTAWOWE', false);
  }

getCurrentView () читает подробности о текущем представлении, а затем передает его в качестве параметра следующему представлению, поэтому при нажатии кнопки «Назад» я будувернуться к представлению, из которого я выполнил действие.

Метод выполнения службы:

  async execute(a: Action, returnView: any) {
    console.log('Recived parameters');
    console.table(returnView);
    const callerViewPath = returnView ? returnView.viewPath : '';
    const callerViewParams = returnView ? JSON.stringify(returnView.viewParams) : '';

    this.caseSrv.giveActionCall(
      a.id,
      callerViewPath,
      callerViewParams
    ).subscribe(
      wa => {
        if (wa.actionType=== 'PORTAL_CHANGE_VIEW') {
          console.log('I am here2');
          console.log(wa);
          this.portalService.changeView(wa.actionName, this.getChangeViewParams(wa));
        }
      }
    );
  }

После первого выполнения все работает нормально.Возвращаемые детали представления передаются как callerViewPath и callerViewParams.После того, как я использую стрелку «назад» в моем приложении, оно вернется к точке, откуда я выполнил действие.

Но тогда, когда я пытаюсь выполнить его в другой раз, оба возвращаемых параметра представления являются пустыми, и кажется, что код начался с подписки в методе execute ().Первый вывод в консоли: «Я здесь2».

Я пытался как-то отписаться о разрушении, но сервис всегда «живет» в жизненном цикле приложения.

Я довольно новичок в RxJS.Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 28 января 2019

Вам необходимо сохранить subscription в компоненте и отменить подписку при выполнении onDestroy.Поэтому необходимо вернуть Subscription from service

Сервис:

async execute(a: Action, returnView: any):Promise<Subscription> {

    const subscription = this.caseSrv.giveActionCall(
      a.id,
      callerViewPath,
      callerViewParams
    )



    subscription.subscribe(
      wa => {
        if (wa.actionType=== 'PORTAL_CHANGE_VIEW') {
          console.log('I am here2');
          console.log(wa);
          this.portalService.changeView(wa.actionName, this.getChangeViewParams(wa));
        }
      }
    );

    return subscription;
  }

Пример кода компонента:

 private subscription;

 ngOnDestroy(){
   if(!!this.subscription){
     this.subscription.unsubscribe();
   }
 }

 async executeAction(action: Action) {
   const proceedingReturnView = this.getCurrentView();
   this.subscription = await this.srv.execute(action, proceedingReturnView);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...