使用Rxjs的“takeUntil”自动取消订阅 - 无需等待发射?

时间:2018-03-12 13:25:19

标签: javascript angular rxjs

我已经阅读了Ben article关于取消订阅,takeUntiltakeWhile谓词版本

I've used it like this example in my Angular app

但有一点我不明白。

假设我有一个Observable,它会在很长一段时间后发出值:

const source = Rx.Observable.interval(10000);

var isContinue=true;

const example = source.takeWhile(val => isContinue)
                      .subscribe(val => {},()=>{},()=>console.log('complete'));

setTimeout(function (){isContinue=false},3000) //somewhere in destructor

嗯,这将显示"完成"仅在10秒之后而不是在3之后。

所以基本上如果我有一个订阅Observable的组件并且observable长时间没有发出值,它仍然会引用我的对象,导致内存泄漏。

问题:

我设置后如何使用takeWhile运算符取消订阅  isContinue值。

我不想信任可能不会发出值并保留对我的组件的引用的服务。

JSBIN

2 个答案:

答案 0 :(得分:1)

我相信你的代码会产生正确的排放 - 但你关心的是完成的及时性(它应该在3秒后完成,而不是10秒)。

takeWhile仅在源observable发出时测试其谓词需要10秒。

takeUntil将解决这个问题,但它需要一个observable来等待:

const source = Rx.Observable.interval(10000);

const abort = new Subject();

const example = source.takeUntil(abort)
                      .subscribe(val=>{}, ()=>{}, ()=>console.log('complete'));

setTimeout(function () {abort.next()}, 3000) //somewhere in destructor

答案 1 :(得分:0)

您需要将input<-read.table(header=TRUE, text ="ranges_in_X51214 ranges_in_X56499 ranges_in_X6383 0.0 0.0 1 0.5 0.5 0 0.5 0.5 0") output <- data.frame(matrix(NA, nrow = nrow(input), ncol = ncol(input))) #a vector of same length as of each row in input dataframe v2 <- numeric(length(input[1,])) v2 <- 1 for (j in 1:nrow(input)){ #take each row from input df v1 <- as.numeric(input[j,]) # Take the sum of both vectors output_vec<-ifelse(v1 == 0, 1, sum(v1)+1) # write the output value at j row output[j,] <- output_vec } 变量设为isContinue并订阅您的两个观察点:Observablesource