RepeatWhen в комбинации 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(), повторно используется для каждой последующей подписки. Как почему?


person Elias    schedule 01.03.2018    source источник


Ответы (2)


Проблема в том, что getValue() оценивается только один раз и сразу. Это не имеет ничего общего с rxjs, просто так работает Javascript. Вместо этого вам нужно оценивать его при каждой повторной попытке, что вы можете сделать, используя defer:

Observable.defer(() => Observable.of(getValue()))
  .repeatWhen(obs => obs.delay(1000))
  .subscribe(console.log);
person Ingo Bürk    schedule 05.03.2018

Проблема с использованием 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);
}
person cse    schedule 01.03.2018
comment
@Elias, мы печатаем variable, а не value. - person cse; 02.03.2018
comment
переменная вернет 1, 2, 3, 4, 5, как вы можете видеть, что делает getValue(). - person Elias; 04.03.2018