RepeatWhen 组合 Observable.of(x) 有意外行为

RepeatWhen in combination Observable.of(x) has unexpected behavior

我在使用 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() 返回的值被每个后续订阅重复使用。怎么样,为什么?

问题出在 value 的使用上。您正在更改 variable 而不是 value(该值在 两个 范围内可用,即 Globalcloser 范围)。

为了解决这个问题,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);
}

问题是 getValue() 只被立即计算一次。这与 rxjs 无关,这就是 Javascript 的工作方式。您需要在每次重试时对其进行评估,您可以使用 defer:

Observable.defer(() => Observable.of(getValue()))
  .repeatWhen(obs => obs.delay(1000))
  .subscribe(console.log);