Javascript 执行可观测对消函数

Javascript 执行可观测对消函数,javascript,rxjs,rxjs6,Javascript,Rxjs,Rxjs6,我想有一个可观察的结果,当取消订阅时,它调用一个函数,但只有当它被取消订阅时,没有错误,也没有完成。我试图构建的可观察对象通常与另一个可观察对象竞争。我想要当另一个可观察的“赢”时,这个执行一个函数 我尝试了finalize操作符,但它总是执行 播放.ts import { timer } from "rxjs"; import { takeUntil, finalize } from "rxjs/operators"; import errorobs$ from "./errorobs";

我想有一个可观察的结果,当取消订阅时,它调用一个函数,但只有当它被取消订阅时,没有错误,也没有完成。我试图构建的可观察对象通常与另一个可观察对象竞争。我想要当另一个可观察的“赢”时,这个执行一个函数

我尝试了finalize操作符,但它总是执行

播放.ts

import { timer } from "rxjs";
import { takeUntil, finalize } from "rxjs/operators";
import errorobs$ from "./errorobs";

export default function() {
  return timer(10000).pipe(
    takeUntil(errorobs$),
    finalize(finalFunc)
  );
}

function finalFunc() {
  console.log("final function executed");
}
errorobs.ts

import { fromEvent } from "rxjs";
import { map } from "rxjs/operators";

export default fromEvent(document.getElementById("errorBtn"), "click").pipe(
  map(() => {
    throw new Error("my error");
  })
);

我在这里做了一个小演示

单击“开始”以开始“可观察”

单击“取消”以使其他可观察到的结果获胜


单击“错误”生成错误

实现此目的的一种方法是使用自定义运算符,如下面的my
onCancel()

const{Observable}=rxjs
函数onCancel(f){
返回可观察的=>新可观察的(观察者=>{
让完成=假
设errored=false
const subscription=observable.subscripte({
next:v=>observer.next(v),
错误:e=>{
错误=正确
观察者错误(e)
},
完成:()=>{
完成=真
观察员:完成()
}
})
return()=>{
订阅。取消订阅()
如果(!completed&&!error)f()
}
})
}
//测试:
常数{interval}=rxjs
const{take}=rxjs.operators
//这个被取消了:
常数s=间隔(200)。管道(
onCancel(()=>console.warn('s cancel!'))
).subscribe(()=>{})
setTimeout(()=>s.unsubscribe(),500)
//此操作在取消订阅()之前完成:
常数q=间隔(200)。管道(
以(2)为例,
onCancel(()=>console.warn('q cancelled!'))
).subscribe(()=>{})
setTimeout(()=>q.unsubscribe(),500)

正如您所描述的,它确实有效<代码>完成在处理链时执行,即所有订阅者取消订阅、链出错或链完成时

RxJS Github页面上已经存在此功能的问题:

在上面的链接中,您可以看到一个自定义运算符的示例,它为
finalize
运算符添加了原因


我不得不自己处理这个用例,并将这个操作符添加到我自己的RxJS操作符集合中:

我也喜欢你的答案。还有你的回购协议!我希望它只在取消时调用函数。