仅当调用函数内部的回调并执行函数的其余部分时,如何调用另一个函数?
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 返回的实际值不同。
【讨论】:
以上是关于仅当调用函数内部的回调并执行函数的其余部分时,如何调用另一个函数?的主要内容,如果未能解决你的问题,请参考以下文章