Javascript RxJS如何退订服务方法

时间:2019-01-28 12:22:42

标签: javascript angular rxjs

我有一个在单击按钮后执行的功能。

public function getID()
{
     \DB::table('students')->insert([
                        [
                            'name' => $row->name, 
                            'project_id' => 1//request()->route('project.show',$item->id)


                        ]
                    ]);
}

getCurrentView()读取有关当前视图的详细信息,然后将其作为参数传递给下一个视图,因此,当我单击“后退”按钮时,我将返回执行操作的视图。

服务执行方法:

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);
  }

第一次执行后,一切正常。返回视图详细信息作为callerViewPath和callerViewParams传递。使用应用程序后退箭头后,它将返回到执行操作的位置。

但是当我再次尝试执行它时,两个返回视图参数均为空,并且似乎代码是从execute()方法中的subscription开始的。控制台中的第一个输出是“我在这里2”。

我试图以某种方式取消订阅,但是该服务在应用程序生命周期中始终“存在”。

我几乎是RxJS的入门者。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您需要将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);
 }