首页 > 解决方案 > 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 调用并发的最佳方法是什么。

标签: rxjs

解决方案


由于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]
    })
  )

推荐阅读