微信小程序请求request异步问题
仅作为Shane个人笔记
问题的起因
不知道什么时候,在写微信小程序的js的时候报错,但是请求回来的结果是没有问题的
打断点调试之后
发现程序执行的顺序并不一致,request请求后面的console会先request success里的console输出
这说明了一件事情,微信小程序的request是异步的
也就是说微信小程序不会等待request请求返回结果之后再接着往下执行,而是request开始执行后,直接执行request后的代码
查明原因之后
Shane发现还是有变相同步的办法------Promise
Promise据网上的说法是某个大神开发出来的,17年后被小程序官方采用,所以无需再引入其他js文件即可使用
看看代码
这里Shane写一个示例
/**
* resolve很重要必须存在
* reject可作为请求失败返回错误信息
*/
hello: function(){
let that = this;
return new Promise(function (resolve, reject){
wx.request({
url: app.globalData.doMain + '/模块/控制器/方法',
method: 'post',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (res) {
//这里可以通过resolve返回请求数据
resolve(res.data.result);
//也可以直接赋值data里的全局变量
//假设data里有个全局变量叫random
//that.data.random = res.data.result;
//但必须有resolve();此时resolve();可不传参
//resolve();
}
});
});
},
写完示例之后,在onload里调用试试
/**
* then是关键
*/
onLoad: function () {
this.hello().then((res) => {
console.log("请求的数据:" + res);
//如果是给全局变量赋值
//引用上文hello当中的假设变量random
//console.log("请求的数据:" + this.data.random);
//后面的代码写这里面来
//甚至在此request之后还有request
//也可以按此形式进行套娃XD
});
//请求后代码不要写then外面
//写then里面去
//不然还是异步的
},
总结
通过Promise可以变相达到同步的效果
虽然不是真正意义上的同步
但是👴还要啥自行车??
- Shane在B站的TP6视频
- 用ThinkPHP6制作后台