为了账号安全,请及时绑定邮箱和手机立即绑定

如何循环进行异步获取?循环变量无法确定?

如何循环进行异步获取?循环变量无法确定?

慕慕森 2019-03-09 20:20:54
需求:利用Github V3版本的API,获取某个用户star的项目个数。而用户的api并没有单独提供star个数,而是提供了这样的接口"starred_url": "https://api.github.com/users/tj/starred{/owner}{/repo}"查了一下,,github api采用分页技术,如果用上述默认接口,最多只能返回30条内容。因而需要利用参数获取:https://api.github.com/users/tj/starred?page=1&per_page=100,per_page最大可为100.也就是说我需要这样GET多个接口,直到获取的接口返回[ ]:axios.get(`/users/${app.userName}/starred?page=${i++}&per_page=100`)循环程序是同步执行的,GET请求是异步获取。然而我的循环变量与异步获取的数据有关!那么循环代码要怎么写呢?下面是我用递归写的代码,不过处理得很慢。。这是demo,可以输入tj试一下,很慢的。let starredLists = []                      !function getStarred(index){     axios.get(`/users/${app.userName}/starred?page=${index++}&per_page=100`)         .then(function(response){             starredLists.push(...response.data)            console.log(starredLists.length + '   ' + index)            if(response.data.length == 100)                 getStarred(index);            if(response.data.length != 100)                 app.stars = starredLists.length;         }) }(1)
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

一定要循环么 用递归请求呗

查看完整回答
反对 回复 2019-03-09
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

用了递归的方式,解决了循环变量无法确定的问题;
同时为了性能,用Promise.all()做了批量请求。获取3个组10个接口(以tj大神的star为例)需要大约10s

//get user's starred repos   let starredLists = [];let promiseTen = [], 
    promiseOne;

!function getStarred(index) {    //用for循环,一次性请求十个接口,加快速度,避免同步-异步-同步的反复切换
    for (let i = 0; i < 10; i++) {
        promiseOne = axios.get(`/users/${app.userName}/starred?page=${index++}&per_page=100`)
            .then(function (response) {
                starredLists.push(...response.data)
            })
        promiseTen.push(promiseOne)
    }    Promise.all(promiseTen).then(() => {        if(starredLists.length % 100 == 0)      //检查是否需要递归
            getStarred(index)                       
        else 
            app.stars = starredLists.length        
    })
}(1)


查看完整回答
反对 回复 2019-03-09
  • 2 回答
  • 0 关注
  • 443 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信