Angular RxJS管道函数不考虑可观测性
我正在从Promises将一个应用升级到RxJS,我不完全确定我是否走上了正确的道路 案例: 给定一个ModalComponent,它在发送HTTP请求时加载,在收到响应时销毁。 所以我做的如下Angular RxJS管道函数不考虑可观测性,angular,typescript,rxjs,rxjs-pipeable-operators,Angular,Typescript,Rxjs,Rxjs Pipeable Operators,我正在从Promises将一个应用升级到RxJS,我不完全确定我是否走上了正确的道路 案例: 给定一个ModalComponent,它在发送HTTP请求时加载,在收到响应时销毁。 所以我做的如下 public post(uri: string, body: object, showLoading: boolean = true, params: object = {}): Observable<any> { if (showLoading) { this.toggleModal(
public post(uri: string, body: object, showLoading: boolean = true, params: object = {}): Observable<any> {
if (showLoading) {
this.toggleModal('open');
}
return this.http.post(
this.createUrl(uri),
body,
this.createOptionsWrapper(params)
)
.pipe(
this.toggleModal('close'),
catchError(err => this.handleError(err))
);
}
toggleModal接受1个参数,并以此为基础打开/关闭模式。我理解可管道运算符必须返回运算符函数类型。你认为什么是最适合上述情况的RxJS运算符?我不接触可观察对象本身,我只想使其可管道化,以便它按给定的顺序运行?可能值得自己创建一个自定义的?当然,这里返回的可观察数据将再次通过管道传输到服务注入的任何地方。如果不想修改响应结果,请使用操作符
return this.http.post(
this.createUrl(uri),
body,
this.createOptionsWrapper(params)
)
.pipe(
tap( () => this.toggleModal('close') ),
catchError(err => this.handleError(err))
);
国际海事组织的运营商最适合这里。它在源完成或出错时调用,不会修改可观察对象的发射
公职
uri:string,
主体:客体,,
showLoading:boolean=true,
参数:对象={}
:可见{
如果显示加载{
这个。切换模式为“打开”;
}
返回this.http.post
这个.createUrluri,
身体
this.createOptionsWrapperparams
管
最终确定=>{
如果显示加载{
这个。切换模式“关闭”;
}
},
catchErrorerr=>this.handleErrorer
;
}
@Michael D是正确的,我认为finalize是合适的操作员,但我也认为您应该将其包含在延迟中:
在您实际订阅之前,模式不会被切换。如果没有延迟,模式将在第1行切换。一般的观点是,如果不延迟,您会创建这样的情况:如果您从不订阅,模态可能会被打开,然后再也不会被关闭。使用“延迟”可确保永远不会发生这种情况。同意“最终确定”是正确的,但也应将其包装在defer@bryan60:如果HTTP observable是冷的,它会有很大的不同吗?这会有很大的不同,因为toggleModal“open”行会在observable变热之前出现,如果observable从不变热,然后模态永远不会关闭。谢谢,了解了很多rxjs网站有一个互动的。我有一个可观察->当它完成、出错或取消订阅时,我想执行一个函数来引导您完成,这是有意义的+1.
public post(uri: string, body: object, showLoading: boolean = true, params: object = {}): Observable<any> {
return defer(() => {
if (showLoading) {
this.toggleModal('open');
}
return this.http.post(
this.createUrl(uri),
body,
this.createOptionsWrapper(params)
).pipe(
finalize(() => this.toggleModal('close')),
catchError(err => this.handleError(err))
);
});
}
let save$ = this.service.post(...)
if (id) {
save$ = this.service.put(...)
}
save$.subscribe();