从for循环中删除嵌套的api调用

时间:2019-05-29 23:09:54

标签: javascript typescript

我进行了一次api调用,以返回一组数据(例如:users-列表类型,使用返回的数据,我创建了一个for循环,并且在我的for循环中,我进行了另一个api调用,以基于以下信息获取用户的个人资料详细信息用户的ID。我知道这不是最佳做法,我想知道如何才能对其进行重构。

api.get(...).then(response => { 
   this.users = response; 
   for(let i=0; i<this.users.length; i++){
     api.get(...this.users[i].id).then(response => {
       if(response.name == this.users[i].name)
         this.newList.push(response);
     })
   }
})

,在我的html中,我遍历this.newList以显示我需要的信息。

我如何从for循环中删除嵌套的api调用,但仍然获得相同的结果?

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用async/await。尽管这不会删除嵌套循环,但会使代码看起来更好

示例

async function getUsersAndProfiles () {
    try {
        this.users = await api.get(...); 
        for(let i=0; i<this.users.length; i++){
            let response = await api.get(...this.users[i].id);
            if (response.name == this.users[i].name)
                this.newList.push(response);
        }
    }
    catch (e)
        console.log(e);
}

您甚至可以将对用户配置文件的api调用移至另一个异步函数,以备将来可能的重用和更好的代码结构

答案 1 :(得分:0)

在将请求数组推入数组之后,我们可以一次使用Promise.all()发出请求,然后我们可以基于结果数组创建newList。

 api.get(...).then(response => {
    this.users = response;
    const promises = this.users.map(user => api.get(...user.id))
    const result = Promise.all(promises).then(result => {
        this.newList = results.filter((user, i) => user.name === this.users[i].name)
    })
})