【问题标题】:How to invoke another function only when both the callback inside a function is invoked and remaining part of the function is executed?仅当调用函数内部的回调并执行函数的其余部分时,如何调用另一个函数?
【发布时间】:2020-08-25 16:19:07
【问题描述】:

我的 Angular 代码

getStatus(transferDTO){
  this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO).subscribe(
    this.save()
  );
  /*
  Remaining code here 
  */
  this.save()
}

function save() {
}

现在我不想调用 this.save() 两次,我希望仅在执行回调以及执行方法中的剩余代码之后才调用它... 当然,我可以通过以下方式解决这个问题

getStatus(transferDTO){
  /*
  Remaining code here 
  */
  this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO).subscribe(this.save());
}

save(){

}

但我不想延迟回调方法。那么我该如何解决这个问题呢?

【问题讨论】:

  • 正确格式化代码,是否要在subscribe方法完成响应时调用this.save()函数?
  • @PrashantPimpale 是的,其余代码也应在调用保存功能时完成
  • 你可以将你依赖的代码包装在里面,如果你有需要的数据就会运行它的块
  • 你能把剩下的代码包装在你的promise的subscribe方法中,并从同一个块中调用save()方法吗?
  • @ShrutikaPatil 当然可以,但我会再次不必要地等待回调被调用以执行一些独立的代码

标签: angular typescript observable


【解决方案1】:

如果您只想让getInventoryStatusIdByStatusNameAndStatusTypeUsingGET 和“剩余代码”并行执行,然后在两者都完成时调用save(),您可以将“剩余代码”包装在 Observable 中并使用forkJoin 执行两个 Observables 并行。

类似这样的:

getStatus(transferDTO) {
  const getStatusId$ = this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO);
  const remainingCode$ = this.getRemainingCode();

  forkJoin(
    getStatusId$,
    remainingCode$
  ).subscribe(res => {
    this.save();
  });
}

getRemainingCode(): Observable<null> {
  return new Observable(subscriber => {
    /*
    Remaining code here 
    */
    subscriber.next();
    subscriber.complete();
  })
}

Here's a stackblitz

【讨论】:

    【解决方案2】:

    您可以滥用startWith() 运算符来实现它。来自文档

    返回一个 Observable,它发出你指定为参数的项目 在它开始发出源 Observable 发出的项目之前。

    试试下面的

    import { startWith } from 'rxjs/operators';
    
    getStatus (transferDTO) {
      this.queryResourceService.getInventoryStatusIdByStatusNameAndStatusTypeUsingGET(transferDTO)
        .pipe(startWith(0))
        .subscribe(
          response => {
            if (response === 0) {
              // run some independent code
            } else {
              // run dependent code
              this.save()
            }
          },
          error => { // handle error }
        );
    }
    

    确保传递给 startWith() 的值与源 observable 返回的实际值不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2018-06-12
      • 1970-01-01
      • 2019-09-11
      • 2011-05-30
      相关资源
      最近更新 更多