RxJS 每秒钟拨打电话不超过一次,但不要丢失任何电话。

基本上我想创建一个队列。比如说

const queue = new BehaviorSubject([])
queue.subscribe((args) => someCall(args))

在那里我可以打电话

queue.next({arg1, arg2, arg3})

在几个地方,有时很快就会相继出现。我不能用 throttledebounce 因为我不能失去中间的调用。我需要每个电话都被呼叫,但每秒钟不超过1次。如果两个人在一秒内开火,一个人要等一秒。如果一秒内有3个呼叫,一个要等1秒,另一个要等2秒。

解决方案:

你可以使用 完成 观察到的东西,并结合 联合所有.

combineAll将在前一个观测点完成后发出下一个观测点。

1. 创建您的主题

const source$$ = new Subject();

2. 提供一个函数,将你的值映射到1000毫秒后完成的Observable。

const timeCompletedSource$ = (time) => (value) => Observable.create(observer => observer.next(v)).pipe(
  takeUntil(timer(time))
);

你不需要把函数time做成动态的,我只是把(time)=> (value)=>……因为我想写一个像throttle(1000)这样有动态时间范围的操作符。你可以直接写(value) =>Observable……如果你想要一个静态时间的话

3. 使用你的函数将你的值映射到一个有时间框的观测值上,并将所有观测值合并到concatAll中。

const result$ = source$$.pipe(
  map(timeCompletedSource$(time))
  concatAll()
);

你发现一个正在运行的stackblitz 此处

专业的。做一个自定义的操作者

const fastThrottle = (time) => (source) => source.pipe(
  map(timeCompletedSource$(1000)),
  concatAll()
)

const result$ = source$$.pipe(
  fastThrottle(1000)
);

给TA打赏
共{{data.count}}人
人已打赏
未分类

材质 UI Fab 按钮停留在左侧分割窗格下。

2022-9-8 21:27:40

未分类

禁用CUDA编译器驱动程序的二进制缓存

2022-9-8 21:27:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索