我已经阅读了Ben article关于取消订阅,takeUntil
,takeWhile
(谓词版本)
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
值。
我不想信任可能不会发出值并保留对我的组件的引用的服务。
答案 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
并订阅您的两个观察点:Observable
和source
。