⼩程序使⽤promise异步转同步,for循环⾥⾯请求赋值因为异步导致赋值错
乱的解决
遇到问题
⾸先简述⼀下⾃⼰在开发是遇到的问题(下图已清晰描述):
解决问题
如果有⽤的话,不如⼀键三连,嘿嘿
既然知道了问题的出现的原因所在,那么就寻解决问题的办法,在⽹上搜索了之后看到了下⾯的这篇⽂章帮助了我解决了我的问题。
⽂章链接:
⾃⼰也通过这篇⽂章对promise进⾏了学习和对代码进⾏了改进(发现⾃⼰原来不会的这么多hhhh),下⾯是对代码的改进,主要改变在getQuestion函数,代码上有注解,是我⾃⼰对程序的理解,如果有写错的地⽅请在评论区帮我指正!
data:{
list:[],
shuzu:[],
shuzu1:[],
show:false,
count:0,
questions:[],
wenti:"",
content:"",
openid: app.globalData.openid,
},
onLoad(){
var that =this;
console.log(app.globalData.openid);
wx.cloud.callFunction({
name:"openapi",
success:function(res){
console.log("openid", sult.openid);
that.setData({
openid: sult.openid,
});
app.globalData.openid = sult.openid;
console.log(app.globalData.openid);
},
fail:function(res){
console.log("失败:"+ res);
},
});
},
//改进的地⽅主要在这个函数和data⾥⾯多了⼏个变量
getQuestion(){
var that =this;
url: app.globalData.host +"/getQuestion",
success(res){
that.setData({
questions: res.data,
});
console.log(res.data);
for(let i =0; i < res.data.length; i++){
//使⽤这种办法得到⼀个promise对象
代码转换let s =new Promise((resolve, reject)=>{
url: app.globalData.host +"/getAnswerByQId",
data:{
question_id: res.data[i].question_id,
},
success(req){
resolve(req.data[0])
},fail(err){
reject(err)
}
});
})
//⽽因为promise是同步的,他会当这个for循环⾥⾯的promise折⾏完成后才去折⾏下⾯的内容,
//所以不会出现因为请求时间问题导致的数据错乱问题
that.data.shuzu.push(s);
console.log(that.data.shuzu)
that.setData({
shuzu1: that.data.shuzu,
});
};
//promise是储存异步请求的结果,可以通过then获得,then是异步操作。
that.data.list.length = that.data.shuzu1.length;
for(let j =0; j < that.data.shuzu1.length;j++){
//既然then是异步操作,那为什么下⾯这段代码赋值不会错乱呢?
//原因是,此循环是通过赋值特定的数组的位,所以不会造成数据错乱,算做是⼀种程序的巧妙设计吧 that.data.shuzu1[j].then(v=>{
that.data.list[j]= v;
that.setData({
list: that.data.list,
});
})
}
},
});
},
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论