这是我的代码:
先决条件
- RxJs 版本:
6.7.7
- 打字稿版本:
3.4.5
- compilerOptions.targe:
es5
function factory(limit: number, period: number) {
let count = limit;
let token = new BehaviorSubject(count);
let availableTokens = token.pipe(
filter((v) => v > 0), // weird
tap((v) =>
`current emit value is ${v}, current BehaviorSubject value is ${token.getValue()}`,
),
),
// filter(() => count > 0), // acting what i expected
take(1),
);
return function (fn: number) {
return availableTokens.pipe(
map(() => {
token.next(--count);
timer(period).subscribe(() => token.next(++count));
return fn;
}),
);
};
}
// created a ratelimiter
// rate: 5 times / 1000 ms
let rateLimiter = factory(5, 1000);
// testing
for (let i = 0; i < 20; i++) {
rateLimiter(i).subscribe({
next: (v) => console.log(v),
});
}
预期
- 第一秒输出:
0 1 2 3 4
- 第二个输出:
5 6 7 8 9
- 第三秒输出:
10 11 12 13 14
- 第四秒输出:
15 16 17 18 19
实际上
- 第一秒输出:
0 1 2 3 4
- 第二个输出:
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
如果使用 filter(() => count > 0)
代替
点击操作员点击调试日志
current emit value is 5, current BehaviorSubject value is 5
current emit value is 4, current BehaviorSubject value is 4
current emit value is 4, current BehaviorSubject value is 4
current emit value is 3, current BehaviorSubject value is 3
current emit value is 3, current BehaviorSubject value is 3
current emit value is 2, current BehaviorSubject value is 2
current emit value is 2, current BehaviorSubject value is 2
current emit value is 1, current BehaviorSubject value is 1
current emit value is 1, current BehaviorSubject value is 1
current emit value is 1, current BehaviorSubject value is 1
current emit value is 1, current BehaviorSubject value is 0
current emit value is 1, current BehaviorSubject value is -1
current emit value is 1, current BehaviorSubject value is -2
current emit value is 1, current BehaviorSubject value is -3
current emit value is 1, current BehaviorSubject value is -4
current emit value is 1, current BehaviorSubject value is -5
current emit value is 1, current BehaviorSubject value is -6
current emit value is 1, current BehaviorSubject value is -7
current emit value is 1, current BehaviorSubject value is -8
current emit value is 1, current BehaviorSubject value is -9
current emit value is 1, current BehaviorSubject value is -10
current emit value is 1, current BehaviorSubject value is -11
current emit value is 1, current BehaviorSubject value is -12
current emit value is 1, current BehaviorSubject value is -13
为什么???
tap
日志:发出值!== 计数
- 我想这两个应该是相等的