Есть ли способ заставить метод возвращать contorl только после того, как будут вызваны все используемые внутри него обратные вызовы? - PullRequest
0 голосов
/ 09 мая 2020

Мой angular код

ngOnInit(){
        console.log("invoking method");
        this.getStatus(this.transferDTO);
        console.log("method invoke control returned control returned");
}

        getStatus(transferDTO){
          this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO).subscribe();
        this.queryResourceService.getStockStocksIdByStatusNameAndStatusTypeUsingGET(transferDTO).subscribe();
    }

Здесь метод getStatus возвращает управление до вызова функций обратного вызова.

Здесь, конечно, я могу провести рефакторинг кода, как показано ниже

ngOnInit(){

        console.log("invoking method");
        this.getStatus(this.transferDTO);
}
       getStatus(transferDTO){
          this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO).subscribe((data)=>{this.getStatus2(data)});
    }
    getStatus2(data){
    this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO).subscribe(controlReturned());
    }
    controlReturned(){
        console.log("method invoke control returned control returned");
    }

, но я не хочу, чтобы getStatus1 вызывался только после того, как вызывается обратный вызов внутри getStatus. Мне нужно, чтобы оба метода вызывались независимо, но функцию controlReturned () следует вызывать только тогда, когда выполняются оба обратных вызова. Как этого добиться?

Ответы [ 2 ]

4 голосов
/ 09 мая 2020

Это лучший вариант использования, который rx js forkJoin решает:

Запрашивать два или более Observable параллельно, но возвращать только после того, как все они разрешены.

getStatus(transferDTO){
        forkJoin(
            this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO),
            this.queryResourceService.getStockStocksIdByStatusNameAndStatusTypeUsingGET(transferDTO)
        ).subscribe(([data1, data2]) => {
            // call your control here
        });
}

PS У вас любопытно длинные имена функций.

0 голосов
/ 09 мая 2020

вы можете использовать pipe и mergeMap для цепочки Observables

  ngOnInit() {
    console.log("invoking method");
    this.getStatus(this.transferDTO);
  }

  getStatus(transferDTO) {
     getStatusObservable(transferDTO)
      .subscribe(() => {});
  }
  getStatusObservable(transferDTO) {
    return this.queryResourceService
      .getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO)
      .pipe(
         mergeMap(() => getStatus2Observable(transferDTO))
         tap(controlReturned)
       );
  }

  getStatus2Observable(data) {
    return this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(data);
  }
  controlReturned(){
    console.log("method invoke control returned control returned");
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...