关于for循环里面使用promise.all的异步问题

2019-11-26  本文已影响0人  szagnesc

最近工作中遇到一个问题。

一个用户列表,在获取到后台返回的信息之后,还需要去单独查询每个用户的另外两条信息,并合并到原来的数组中。

一开始,我是这样写的。

data.forEach((item, index) => {

        Promise.all([this.xx(item.userId), this.xx(item.userId)]).then(resArr => {

              if (resArr && resArr.length) {

                    data[index] = Object.assign(data[index], ...resArr)

                    if (index=== data.length-1) {

                       this.setData({

                         userList: [...this.data.userList, ...data]

                       })

                    }

               }

       })

})

最后发现每次我获取列表的时候,返回的关于另外两条额外获取的信息结果都是不一样的,debugger之后发现原来循环里面的每个promise返回结果的速度都不一样,导致Index也是一直在变化的,因此不能根据Index来判断是否已经循环完成,只能把代码改成如下

let count = 0

     data.forEach((item, index) => {

            Promise.all([this.xx(item.userId), this.xx(item.userId)]).then(resArr => {

                  count++

                  if (resArr && resArr.length) {

                    data[index] = Object.assign(data[index], ...resArr)

                    if (count === data.length) {

                      this.setData({

                        userList: [...this.data.userList, ...data]

                      })

                    }

                  }

                })

              })

增加一个count变量手动计数,来判断是否已经执行完。

以上。

上一篇 下一篇

猜你喜欢

热点阅读