Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular RxJS管道函数不考虑可观测性_Angular_Typescript_Rxjs_Rxjs Pipeable Operators - Fatal编程技术网

Angular RxJS管道函数不考虑可观测性

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(

我正在从Promises将一个应用升级到RxJS,我不完全确定我是否走上了正确的道路

案例: 给定一个ModalComponent,它在发送HTTP请求时加载,在收到响应时销毁。 所以我做的如下

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();