微信小程序 在for循环中调用wx.request异步请求数据

  • 场景:渲染一个聊天列表,按消息往来时间排序。
  • 在for循环中调用wx.request,开始在把整个for包装成一个Promise,然后发现request就是异步的,多次请求回来的数据在for循环里就出现乱序了。然后想把每个request包装成Promise,但for循环次数不确定,想写回调地狱都没得写。这种情况可以用ES7的async await。
  • async用来声明一个函数是异步的,该函数会返回一个Promise对象。
  • await可理解为async wait,await必须出现在async内部。它的主要任务是等待async的resolve,如果等待的是Promise对象,会造成异步函数停止执行并等待Promise的解决
  • 代码
  requestMessage(item){
    return new Promise((resolve,reject)=>{
      wx.request({
        url:'获取渲染数据的服务器地址',
        method:'GET',
        data:{
          userId:item.receiverId
        },
        success:res=>{
          console.log(res);
          this.setState({
            contactList:this.state.contactList.concat({
              receiverId:res.data.data.userId,
              avatarUrl:res.data.data.avatarUrl,
              userName:res.data.data.userName,           
            })
          })
          resolve(); // 返回给await
        }
      })
    })
  }
  onLoad(){
  	// ...
    (async ()=>{
      for(let i=0;i<res.data.data.length;i++){
        let item=res.data.data[i];
          await this.requestMessage(item);
      }
 	})()
 	// 把箭头函数(一个匿名函数)声明async,在循环中await要渲染的数据。再包一层立即执行函数
  }
  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值