0

I have 5 functions which will return data. I have to execute all these functions before executing the 6 th function. Currently, it is executing the 6th func before all 5 functions return data. This happens only the first time. The second time,when 6 th function is executing,it has all the data from the 5 functions.

ngOnInit()
{   this.getTitle();                     //func 1
    this.getNation();                  
    this.getGender();                        
    this.getPass();
    this.getPax();                       //func 5
    this.patchFormValue();               //func 6
}



  private getTitle() {                 // 5  similar functions that return data
    this._addNewPassengerService.getTitle()
      .pipe(takeUntil(this.componentDestroyed$))
      .subscribe(
        resData => {
          this.titleData = resData || [];
          this._changeDetector.detectChanges();
        }
      );
  }


  private patchFormValue() {
    const data = this.data.passengerDetails;
    if (data && this.titleData && this.nationData
      && this.paxData &&this.genderData && this.passengerData) {       
    this.addPassengersFormGroup.controls.passengerFormArray['controls'].forEach(group => 
      {
        group.patchValue(data);
      });

      this._changeDetector.detectChanges();
    }
  }

1 Answer 1

2

You can achieve that using the RxJS forkJoin function to chain all the functions (which should return observables instead of subscribing within them).

Try the following:

ngOnInit() {
  forkJoin([
    this.getTitle(),
    this.getNation(),
    this.getGender(),
    this.getPass(),
    this.getPax(),
  ]).subscribe(() => {
    // here you can call the 6th function or anything else, since all the other functions (observables) have been completed
    this.patchFormValue(); //func 6
  });
}

// The functions (except 6th should return Observable to be cahined together using `forkJoin`)
private getTitle(): Observable<any> {
  // 5  similar functions that return data
  this._addNewPassengerService.getTitle().pipe(
    tap((resData) => {
      // handle the resData here instead of `subscribe`
      this.titleData = resData || [];
      this._changeDetector.detectChanges();
    }),
    takeUntil(this.componentDestroyed$)
  );
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.