我有两个api endpoinst,第一个用于获取列表,第二个用于通过id获取详细信息。现在,我必须将这两个联系起来,以获取包含详细信息的列表。
现在,我使用forkJoin来做到这一点,除了请求并行发送外,它工作得很完美。
但我不能并行发送这么多请求,因为api服务器有速率限制,我怎样才能串行发送请求并获得相同的结果呢?
/* get list
[
{id: 1, name: 1},
{id: 2, name: 2},
{id: 3, name: 3}
]
*/
function getList() {
return get('http://example.com/list')
}
/* get details by id
{
id: 1,
author: 'hello',
title: 'world'
}
*/
function getDetails(id) {
return get('http://example.com/list/' + id)
}
// now this works, but all request send in parallel
Observable.fromPromise(getList()).switchMap(data =>
Observable.forkJoin(data.map(item =>
Observable.fromPromise(getDetails(item.id)).map(details => ({
...item,
details
}))
))
).map(data => console.log(data))
//data is an array here
/*
[
{id: 1, name: 1, details: {id:1, author: 'hello', title: 'world'}},
{id: 2, name: 2, details: ...},
{id: 3, name: 3, details: ...}
]
*/
答案 0 :(得分:0)
您可以使用静态concat方法
Rx.Observable.concat.apply(null,data.map(item =>
Observable.fromPromise(getDetails(item.id)).map(details => ({
...item,
details
}))
)