0

I have two api endpoinst, the first one for fetching the list and second one for fetching the details by id. Now, I have to conbine these two togethere to get a list with details information.

For now, I used forkJoin to do this, and it works perfect except the request is send in parallel.

But I can't send so many request in parallel since the api server has rate-limit, how can I send request in series and get the same result?

/* 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: ...}
    ]
*/
Li Hu
  • 1

1 Answers1

0

You can use static concat method

Rx.Observable.concat.apply(null,data.map(item => 
    Observable.fromPromise(getDetails(item.id)).map(details => ({
        ...item,
        details
    }))
)
Fan Cheung
  • 10,745
  • 3
  • 17
  • 39