RxJS 过滤器操作符表现怪异

时间:2021-05-14 10:07:07

标签: rxjs

这是我的代码:

  • 功能是关于:速率限制某事

先决条件

  • 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 日志:发出值!== 计数
  • 我想这两个应该是相等的

0 个答案:

没有答案