使用rxjs串行发送请求,如forkJoin的系列版本

时间:2018-01-04 03:29:14

标签: javascript rxjs observable

我有两个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: ...}
    ]
*/

1 个答案:

答案 0 :(得分:0)

您可以使用静态concat方法

Rx.Observable.concat.apply(null,data.map(item => 
    Observable.fromPromise(getDetails(item.id)).map(details => ({
        ...item,
        details
    }))
)