一般我们在开发web项目的时候都是同步执行的,也就是执行完一个函数接下去才会执行下一个函数。
但最近我在开发微信小程序和小游戏的发现微信为了更好的用户体验,所以都是异步的, 这样就会对我们的开发照成一定的困难。
例如一些当用户登陆后获得code去后端换取相应的令牌,但是如果是异步的话,就可能会执行其他需要到这个令牌的函数再执行去获取令牌,那也就会照成一些函数的过滤,也就是数据的丢失。所以在解决这个问题上我也查阅过一些资料,因为一开始开发紧张和对令牌的要求不是很大,所以就没太注意,后来发现不行了发现个简单代替的缓存异步阻塞,想简单的阻塞一下看下会不会改变调用顺序上的问题,最后还是发现这是不可行的,所以就只能用网上最常用用promise组件来做到同步的效果。
首先我们需要将promise组件下载,然后引入
1:到bluebirdjs官网bluebirdjs下载对应的bluebird.min.js然后将其引入,我是将此js改为promise.js。
var Promise = require('./promise.js')
使用以上语句将其引入
2.将需要request的函数加上对应的promise方法
getToken(){
return new Promise(function (resolve, reject) {
wx.request({
url: 'xxx',//请求地址
data: {//发送给后台的数据
},
header: {//请求头
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST",//get为默认方法/POST
success: function (res) {
resolve(res.data);//将结果往上抛
},
fail: function (err) { },//请求失败
complete: function () { }//请求完成后执行的函数
})
}
}
以上为简单的request方式,这里用户可以加上缓存wx.getStorageInfoSync同步获取到缓存有就不需要request了,只需要注意还是用resolve(data);的方式将缓存的东西和request的东西保持一致往上抛返回给调用的方法。
3.调用步骤2的函数
let _this = this;
_this.getToken().then(function (res) {
//res就是步骤2中的resolve的值
//将其值获取后再进行相应的逻辑即可。
})
以上即是promise的简单调用,可能项目需要的深度不是很深,就没继续深究下去,不过大部分小程序或者小游戏的场景都可以直接使用了。