这不是一个真正的问题。
赋值/函数调用
一个简化的例子
等号运算符为变量赋值。函数调用返回值
function inc(n){
return n + 1
}
const result = inc(5)
console.log(result); // 6
这里的结果是数值6。不是计算5+1的函数。5+1在这里只发生一次。
现在考虑这个随机增加数字 1 或 2 的函数
function bump(n){
const nu = Math.random();
return nu < 0.5 ? n + 1 : n + 2
}
const result = bump(5);
console.log(result); // 7
console.log(result); // 7
console.log(result); // 7
console.log(result); // 7
console.log(result); // 7
每次打印结果都是一样的。 bump 只被调用了一次,并且只生成了一次随机数。
function bump(n){
const nu = Math.random();
return nu < 0.5 ? n + 1 : n + 2
}
console.log(bump(5)); // 7
console.log(bump(5)); // 7
console.log(bump(5)); // 6
console.log(bump(5)); // 7
console.log(bump(5)); // 6
这里bump被调用了5次,每次都产生一个新的随机数。
修复 checkExistence
有两种方法。
- 而不是生成一次值并重新使用它。每次您需要时,都会在您的投票中生成一个新的布尔值。
function checkExistencePoll(): Observable<boolean> {
const POLL = 5000;
return checkExistence().pipe(
expand(_ =>
timer(POLL).pipe(
switchMap(() => checkExistence()),
takeUntil(stop),
repeatWhen(() => start)
)
)
);
}
- 让
checkExistence 返回一个在订阅时生成新布尔值的可观察对象
function checkExistence(): Observable<boolean> {
return defer(() => {
const nu = Math.random();
const rand = nu < 0.5;
console.log(nu, rand);
return of(rand);
});
}
处理订阅
在您的代码中,expand 正在生成一个订阅主题(称为 start)的 observable,以便决定何时重复。每个可观察的expand 创建的都是这样做的。因此,当start 发出时,每个都会重复。您应该期望 batches 个布尔值等于您创建的并发 observable 的数量。