我在使用 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() 返回的值被重用于每个后续订阅。怎么,为什么?
问题是getValue()
只被评估一次并且立即。这与 rxjs 无关,这只是 Javascript 的工作方式。 您需要在每次重试时对其进行评估,您可以使用defer
执行此操作:
Observable.defer(() => Observable.of(getValue()))
.repeatWhen(obs => obs.delay(1000))
.subscribe(console.log);
问题出在使用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);
}