rxjs - Rxjs 递归调用 - 并发
问题描述
我有以下示例代码,它递归地从某个 REST 资源中提取数据。每个端点都提供以下 JSON 内容
{ data: '123', urls: ['https//example/bar', 'https//example/bim'] }
我可以构建一个像这样递归地提取内容的 Rx 流:
function getData(url) {
return fromFetch(url).pipe(
mergeMap(resp => resp.json()),
mergeMap(content => merge(of(content.data), ...content.urls.map(getData)))
)
}
我的问题是在这里控制 HTTP 调用并发的最佳方法是什么。
- 这可以通过自定义调度程序来实现吗?
- 还是我应该简单地将 fromFetch 包装到一个类中,该类控制在任何时间点可以进行多少 HTTP 调用的并发性?
解决方案
由于expand
您可能最多只能获得 1 个并发,使用 subject + mergeMap 更容易控制并发,这样您就只有一个通道可以工作。
const fetchSubject=new Subject();
fetchSubject.pipe(
mergeMap(url=>fromFetch(url),null,CONCURRENCY)
mergeMap(resp => resp.json()),
tap(url=>content.urls.map(url=>fetchSubject.next(url))
scan((acc,curr) =>{
return [curr.data,...acc]
})
)
推荐阅读
- c - 无法执行 GNUmakefile。Windows 10,Visual Studio 代码。**GNUmakefile:5: ../GNUmakefile: 没有这样的文件或目录 make: ***
- angular - 如何为以下功能编写单元测试用例
- javascript - 使用 JavaScript API 搜索
- javascript - 如何使用 JavaScript 上的单个按钮对多个输入进行乘法运算?
- css - chakra UI - 顶部垂直对齐
- javascript - 反应原生文档选择器在发布模式下不工作
- php - PDO::lastInserteId() 是否从特定表返回最后插入的 id?
- java - Spring Cloud Gateway 资源服务器:不存在主题替代名称
- javascript - 如何在不重新加载页面的情况下添加类
- c# - WPF:在代码中从祖先调用 ICommand