javascript - RxJS:批量请求和共享响应
问题描述
假设我有一个函数fetchUser
,它以参数为参数userId
并返回一个可观察的 user。
由于我经常调用此方法,因此我想批量处理 id 以执行一个具有多个 id 的请求!
我的麻烦就从这里开始...
如果不在fetchUser
.
import { Subject, from } from "rxjs"
import { bufferTime, mergeMap, map, toArray, filter, take, share } from "rxjs/operators"
const functionThatSimulateAFetch = (userIds: string[]) => from(userIds).pipe(
map((userId) => ({ id: userId, name: "George" })),
toArray(),
)
const userToFetch$ = new Subject<string>()
const fetchedUser$ = userToFetch$.pipe(
bufferTime(1000),
mergeMap((userIds) => functionThatSimulateAFetch(userIds)),
share(),
)
const fetchUser = (userId: string) => {
const observable = fetchedUser$.pipe(
map((users) => users.find((user) => user.id === userId)),
filter((user) => !!user),
take(1),
)
userToFetch$.next(userId)
return observable
}
但这很丑陋,而且有很多麻烦:
fetchUser
如果我在计时器结束之前取消订阅返回的 observablebufferTime
,它不会阻止用户的获取。- 如果我
fetchUser
在批处理完成之前取消订阅返回的所有可观察对象,它不会取消请求。 - 错误处理更复杂
- ETC
更一般地说:我不知道如何解决需要使用 RxJS共享资源的问题。很难找到 RxJS 的高级示例。
解决方案
我认为@Biggy 是对的。
这是我理解问题和你想要达到的目标的方式
- 您的应用中有不同的地方要获取用户
- 您不想一直触发 fetch 请求,而是希望缓冲它们并以一定的时间间隔发送它们,比如说 1 秒
- 您想取消某个缓冲区并避免在 1 秒间隔内触发获取一批用户的请求
- 同时,如果有人(我们称之为X 位置的代码)请求了一个用户,而仅仅几毫秒后其他人,即Y 位置的代码取消了整批请求,那么X 位置的代码必须接收某种类型的请求答案,让我们说一个
null
- 此外,如果在缓冲时间的间隔内,您可能希望能够要求获取用户然后改变主意,并避免获取此用户(我不确定这是否真的是您想要的,但它似乎以某种方式从你的问题中浮现出来
如果这一切都是真的,那么您可能必须有某种排队机制,正如 Buggy 所建议的那样。
那么这种机制可能有很多实现。
推荐阅读
- c# - 动态获取第一个 Excel 工作表的名称并将其影响到变量
- c# - 添加属性以显示一些信息
- typescript - 修复 tslint 规则时从字符串中间删除文本
- javascript - 如何通过将光标移到 DIV 上来修改 DIV 内的图像
- c# - 如何在带有 Ajax Post 的 .net core mvc 中使用模型绑定器?
- javascript - 仅在流结束后才解决 Promise
- apache-spark - 使用滞后函数后将 null 替换为数据框中的另一个值
- python-3.x - 如何在 Python 中编写递归函数?
- javascript - JavaScript - “组合”两个相似的对象数组
- firebase - 如何在 Firebase 云功能中更新文档