我对Observable.of()和repeatWhen有意想不到的行为。我想知道这是否是正确的行为,为什么?
const value = 5;
let variable = 0;
const getValue = () => {
variable = variable + 1;
return value * variable;
}
function test () {
Observable.of(getValue())
.repeatWhen(obs => obs.delay(1000))
.subscribe(value => console.log(value);
}
预期:5 10 15 20 ...
结果:5 5 5 5 ...
显然,Observable.of()返回的值将重复用于每个后续订阅。怎么样,为什么?
答案 0 :(得分:1)
问题是getValue()
只会立即评估一次。这与rxjs无关,它只是Javascript的工作方式。您需要在每次重试时对其进行评估,您可以使用defer
:
Observable.defer(() => Observable.of(getValue()))
.repeatWhen(obs => obs.delay(1000))
.subscribe(console.log);
答案 1 :(得分:0)
问题在于使用value
。您正在更改variable
而非value
(此值也可用于两个范围,即全球和更近范围) 。
要解决此问题,更改getValue
的定义,如下所示:
const getValue = () => {
variable = variable + 1;
value = value * variable;
return value;
}
因此,更正的代码将如下所示:
const value = 5;
let variable = 0;
const getValue = () => {
variable = variable + 1;
value = value * variable;
return value;
}
function test () {
Observable.of(getValue())
.repeatWhen(obs => obs.delay(1000))
.subscribe(value => console.log(value);
}