重复时组合 Observable.of(x) 具有意外行为



我在使用 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);
}

最新更新