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

时间:2018-03-01 16:00:26

标签: rxjs5 reactive

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

2 个答案:

答案 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);
}