rxjs 并发后合并流

需求
异步得到一个列表,返回的是一个数组[1,2,3,4,5]
再次异步并发请求携带数组中参数
返回[2,4,6,8,10]

问题
如何将第一次异步请求得到的参数并发出去,最后合并成一个流?

function mock () {
    return new Promise(res => {
      setTimeout(_ => {
        res({
          code: 1,
          ids: [
            1, 2, 3, 4, 5
          ]
        })
      }, 200)
    })
  }
function asyncData (id) {
    console.log(id)
    return new Promise(res => {
      setTimeout(_ => {
        res({
          id: id * 2
        })
      }, 300)
    })
  }
//我的错误方式
Rx.Observable.from(mock())
.map(v => v.ids)
.mergeMap(v => Rx.Observable.from(v.map(id=>asyncData(id))))
.subscribe(v => {
    console.log(v)
  })
阅读 4.3k
2 个回答

按你的需求返回[2,4,6,8,10]应该是:

Rx.Observable.from(mock())
  .mergeMap(data => Rx.Observable.from(data.ids).mergeMap(id => Rx.Observable.fromPromise(asyncData(id)).map(data => data.id)))
  .subscribe(v => console.log(v));
from(mock())
  .pipe(
    switchMap(v => v.ids),
    mergeMap(id => from(asyncData(id))),
    map(data => data.id),
    toArray(),
  )
  .subscribe(console.log)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进