场景:渲染一个聊天列表,按消息往来时间排序。在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要渲染的数据。再包一层立即执行函数}