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