Observable<any>.subscribe中的finalize和complete区别

本文解释了JavaScript库RxJS中的finalize和complete操作符的区别:finalize在任何取消订阅时执行,而complete仅在成功完成时执行。作者通过示例展示了如何在适当场景中使用这两个功能。
摘要由CSDN通过智能技术生成

之前一直以为complete就是完成之后不论成不成功都会进入,就和try catch 里面的finally一样,直到今天,我写在complete里面的代码,在进入error之后没进入,才发现。去查了下总结下。

finalize和complete都是用于处理可观察对象结束时的操作符,但是它们有一些区别:
  • finalize是一个管道操作符,它需要在subscribe之前使用pipe方法来应用于可观察对象。finalize接受一个函数作为参数,这个函数会在可观察对象被取消订阅时执行,无论是因为成功、错误还是主动取消订阅。
  • complete是一个订阅回调函数,它需要在subscribe方法中作为第三个参数传入。complete只有在可观察对象成功完成时才会执行,如果发生错误或者主动取消订阅,complete不会执行。
import { interval, finalize, tap, noop, timer } from 'rxjs';

const source = interval(100).pipe(
  finalize( () => console.log(' [finalize] Called')),
  tap( {
    next: () => console.log(' [next] Called'),
    error: () => console.log(' [error] Not called'),
    complete: () => console.log(' [tap complete] Not called')
  })
);

const sub = source.subscribe(
  x => console.log(x),
  noop,
  () => console.log(' [complete] Not called')
);

timer(150).subscribe(
  () => sub.unsubscribe()
);

运行的结果是:

 [next] Called
0
 [next] Called
1
 [finalize] Called

可以看到,finalize在取消订阅时被调用了,而complete没有被调用。如果想要在可观察对象结束时无论如何都执行一些操作,应该使用finalize操作符。如果只想要在可观察对象成功完成时执行一些操作,应该使用complete回调函数。

关于其中的noop函数,可以看我另一篇blog:
https://blog.csdn.net/Damien_J_Scott/article/details/132692290​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值