RxJS:确保;轻敲;即使在退订后也会被解雇

RxJS:确保;轻敲;即使在退订后也会被解雇,rxjs,Rxjs,即使取消订阅,我如何确保调用tap操作员?想象一下: function doUpdate() { return this.http.post('somewhere', {}) .pipe( tap(res => console.log(res)) ) } const sub = doUpdate().subscribe(res => /* do something with res */); setTimeout(()

即使取消订阅,我如何确保调用tap操作员?想象一下:

function doUpdate() {
    return this.http.post('somewhere', {})
        .pipe(
            tap(res => console.log(res))
        )
}

const sub = doUpdate().subscribe(res => /* do something with res */);
setTimeout(() => sub.unsubscribe(), 1000)
在这种情况下,我只想阻止执行subscribe操作,但我想确保控制台日志被触发,即使执行请求的时间超过1000毫秒(在这种特殊情况下,我甚至不想取消POST)。

使用finalize()操作符,虽然当observable完成时也会调用它

function doUpdate() {
    return this.http.post('somewhere', {})
        .pipe(
           finalize(() => console.log(res))
        )
}
下面是一些代码来演示这个想法:
取消订阅http请求肯定会取消该请求,您可以尝试shareReplay

function doUpdate() {
    return this.http.post('somewhere', {})
        .pipe(
            tap(res => console.log(res)),
            shareReplay()
        )
}
如果这不起作用,就把结果传给受试者

function doUpdate() {
    const subject = new Subject();
    this.http.post('somewhere', {})
        .pipe(
            tap(res => console.log(res))
        ).subscribe(subject);
    return subject;
}

但我想这篇文章还是会被取消的吧?我将无法访问
res
它将无法访问。除非您在订阅后立即取消订阅。事实上,即使是switchMap也不能取消post。Chrome只会在多个http触发过快时取消http取消订阅使用http创建的observable绝对会取消请求。需要更正我的评论,即使立即取消订阅也不能保证取消http(如果http已在浏览器中触发)。是的,您将无法访问res,如果您也想访问res,那么应该有一个不同的解决方案,它不会取消http。查看网络选项卡评论错误答案,但fetch不是角度http客户端,请检查此处的网络点击。请在代码
const sub=http.get('https://jsonplaceholder.typicode.com/todos/1订阅(val=>{});sub.取消订阅()您正在请求http.get('/')不是有效的。还请看一看如何取消http以及它需要什么样的特殊处理。observable仍然被取消,这就是本次讨论的开始