多次请求API(分页)的正确方法

时间:2018-08-03 15:35:04

标签: javascript node.js express

我正在使用Riot Games API构建应用程序,我想检索给定玩家玩的所有比赛。

这是检索此类数据的途径:

/lol/match/v3/matchlists/by-account/{accountId}

问题在于,每个请求的API限制为100个结果,因此,如果要检索所有匹配项(我的情况),则必须使用附加参数beginIndex执行一系列请求以指定响应的初始位置。

所以我有一个函数接收(index,accountId,region)并执行查询以返回结果作为承诺:

const request = (beginIndex, accountId, region) =>{
    const key = '&api_key=mykey';
    const path = 'https://' + region + '.api.riotgames.com/lol/match/v3/matchlists/by-account/' + accountId +'?beginIndex=' + beginIndex;

    return new Promise(resolve =>{
        axios.get(path+key)
             .then(response => resolve(response.data.matches))
             .catch(err => console.log(err))    
})

另一个发出初始请求的函数,比较结果的length是否为100,如果是,它将连续调用request()并获取数据,直到length变为小于100,表示它已到达最后一页。然后返回包含所有数据的数组:

const expand = async(id,index=0,lastSize=0) =>{
    const initialRequest = await request(index,id,'br1');

    if(initialRequest.length < 100)
        return initialRequest;

    let allMatches = initialRequest;
    lastSize = initialRequest.length;

    while(lastSize === 100){
        index += 100;
        let partialResult = await request(index,id,'br1');
        allMatches = allMatches.concat(partialResult);
        console.log(allMatches.length);
        lastSize = partialResult.length;
    }

    return allMatches.map(match => match.timestamp);

效果很好,我正在检索所有者进行的所有比赛,但是我感觉我在表现方面做得非常错误。我有很多嵌套的请求,这不好。因此,我想问您关于如何更好地执行此任务的意见?

0 个答案:

没有答案