仅当调用函数内部的回调并执行函数的其余部分时,如何调用另一个函数?

Posted

技术标签:

【中文标题】仅当调用函数内部的回调并执行函数的其余部分时,如何调用另一个函数?【英文标题】: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 当然可以,但我会再次不必要地等待回调被调用以执行一些独立的代码 【参考方案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 返回的实际值不同。

【讨论】:

以上是关于仅当调用函数内部的回调并执行函数的其余部分时,如何调用另一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

vb 回调函数 详解

node14---分层结构数据库操作

如何在外面引用js中ajax回调函数中的值

普通函数与回调函数的区别

node.js异步回调

回调函数如何传参?