【发布时间】:2022-01-25 19:25:26
【问题描述】:
我有几个链接,其中一个代表用户的活动订单。当用户点击它时,我想向 API 发送一个 HTTP DELETE 请求。我的组件 ts 文件中有一个函数,它从我的模板中调用,如下所示:
// Component
interface CancelCommand {
orderId: string
}
private cancelCommands = new Subject<CancelCommand>();
/* Get called from a template on click, like so
<a ... (nzOnConfirm)="cancel(ord.id)">Cancel</a> */
cancel(orderId: string) {
this.cancelCommands.next({
orderId: orderId
})
}
我在ngOnInit 中订阅主题cancelCommands:
// Component
ngOnInit(): void {
this.cancelSub = this.cancelCommands.pipe(
mergeMap((command) => this.service.cancelOrder(command)))
).subscribe()
}
在服务中cancelOrder函数只是调用HttpClient
// The Service
cancelOrder(command: CancelCommand) : Observable<CommandResponse> {
return this.http.delete<CommandResponse>(`${this.url}/${command.orderId}`)
}
我的问题是,为什么 this.cancelSub 订阅的 observable 在取消第一个订单后停止发出值?
【问题讨论】:
-
这很可能是由于 http.delete 完成并关闭了订阅。在这种情况下,我会使用 switchMap 它为每个删除请求创建一个新的 observable
-
我建议在 subscribe() 中使用完整的观察者并记录事件——然后你就知道是否发生了错误或者是否调用了完成。无论如何,您应该有一个处理错误情况的处理程序。
-
我无法复制您的错误:stackblitz.com/edit/angular-ivy-1se9yc?file=src/app/…。显然,如果 observable 出错或完成,订阅将被关闭。尝试检查是否发生此类情况。
-
我也无法复制错误。同时我想知道您为什么不采用更简单的方法,例如让
cancel方法直接调用cancelOrder服务方法而不是nextingcancelCommands主题? -
@PilgrimViis:您似乎根据条件明确抛出错误。如果一个 observable 发出一个
error,它会在之后关闭,类似于complete发射。事实上,error和complete是排他性的。报错后是否继续订阅?