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
(该值在 两个 范围内可用,即 Global 和 closer 范围)。
为了解决这个问题,将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);
我在使用 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
(该值在 两个 范围内可用,即 Global 和 closer 范围)。
为了解决这个问题,将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);