Home > Software design >  angular asynchronous request returns empty value
angular asynchronous request returns empty value

Time:12-08

From ngOnchanges I called the method _generateLocationFormForApproval and it has an output which is this.absoluteUri. After calling _generateLocationFormForApproval the next call is _pageEventDealsForApprovalList. Now I want to access the result from _generateLocationFormForApproval whic is this.absoluteUri inside _pageEventDealsForApprovalList after its result but it is giving me undefined although this.absoluteUri has a value.

Why is this.absoluteUri undefined inside _pageEventDealsForApprovalList ?

Any idea ? with the asynchronous call ? Thansk.

#code

  ngOnChanges(changes: SimpleChanges): void {
      if(this.dealId) {
        this._generateLocationFormForApproval();
        this._pageEventDealsForApprovalList();
      }
    }
    
    
    
    private  _generateLocationFormForApproval() {
      this.dealService.generateLocationSubmission(this.dealId)
      .subscribe({
        next: (res) => {
          if (res.isSuccess) {
            this.absoluteUri = res.data.absoluteUri;
          }
        },
        error: err => this.notificationService.showError(err),
        complete: noop,
      });
    }
    
private _pageEventDealsForApprovalList() {
  console.log("1")
  console.log("this.absoluteUrithis.absoluteUri" , this.absoluteUri)
  this.searchInput = '';
  const status = [DEAL.STATUS.FORAPPROVAL, DEAL.STATUS.APPROVED]
  this.dealType = [];
  this.isLoading = true;
  this.dealService
    .getAllDeals(
      status,
      this.accountId,
      this.transaction.id,
      this.table.pageIndex   1,
      this.table.pageSize,
      this.searchInput,
      this.table.sortParams,
      this.table.sortDirs,
      this.dealType
    )
    .pipe(finalize(() => (this.isLoading = false)))
    .subscribe((res) => {
        if(res) {
          console.log("this.uri" , this.absoluteUri)
        }
    }, (err) => this.notificationService.showError(err)
  );
}

CodePudding user response:

Try to use Promise to call two API asynchronously.

Use this code

    ngOnChanges(changes: SimpleChanges): void {
      if(this.dealId) {
        this._generateLocationFormForApproval().then((data)=>{
        console.log(data)
        if(data)
          this._pageEventDealsForApprovalList();
        }
      }
    }
    
    
    
    private  _generateLocationFormForApproval() {
       return new Promise((resolve,reject)=>{
          this.dealService.generateLocationSubmission(this.dealId)
          .subscribe({
            next: (res) => {
              if (res.isSuccess) {
                this.absoluteUri = res.data.absoluteUri;
                resolve(this.absoluteUri);
              }
            },
            error: err => {
                  this.notificationService.showError(err);
                  reject(err)
            },
            complete: noop,
          });
      })
    }
    
private _pageEventDealsForApprovalList() {
  console.log("1")
  console.log("this.absoluteUrithis.absoluteUri" , this.absoluteUri)
  this.searchInput = '';
  const status = [DEAL.STATUS.FORAPPROVAL, DEAL.STATUS.APPROVED]
  this.dealType = [];
  this.isLoading = true;
  this.dealService
    .getAllDeals(
      status,
      this.accountId,
      this.transaction.id,
      this.table.pageIndex   1,
      this.table.pageSize,
      this.searchInput,
      this.table.sortParams,
      this.table.sortDirs,
      this.dealType
    )
    .pipe(finalize(() => (this.isLoading = false)))
    .subscribe((res) => {
        if(res) {
          console.log("this.uri" , this.absoluteUri)
        }
    }, (err) => this.notificationService.showError(err)
  );
}

 

CodePudding user response:

In this scenario I would recommend using the switchMap function from RxJs.

You would do something along the lines of this (warning: not tested):

ngOnChanges(changes: SimpleChanges): void {
  // It was originally this, but if you're looking for changes to the dealId you should use changes.dealId instead
  if (changes.dealId) {
    this.dealService.generateLocationSubmission(this.dealId)
      .pipe(
        switchMap(res => {
          if (!res.isSuccess) {
            return of(res);
          }
          this.absoluteUri = res.data.absoluteUri;
          return this._pageEventDealsForApprovalList(this.absoluteUri);
        }),
        finalize(() => (this.isLoading = false))
      )
      .subscribe(
        res => {
          if (res) {
            console.log('this.uri', this.absoluteUri);
          }
        },
        err => this.notificationService.showError(err)
      );
  }
}

private _pageEventDealsForApprovalList(absoluteUri): Observable<any> {
  console.log('1');
  console.log('this.absoluteUrithis.absoluteUri', this.absoluteUri);
  this.searchInput = '';
  const status = [DEAL.STATUS.FORAPPROVAL, DEAL.STATUS.APPROVED];
  this.dealType = [];
  this.isLoading = true;
  return this.dealService.getAllDeals(
    status,
    this.accountId,
    this.transaction.id,
    this.table.pageIndex   1,
    this.table.pageSize,
    this.searchInput,
    this.table.sortParams,
    this.table.sortDirs,
    this.dealType
  );
}
  • Related