赞
踩
背景:刚打开小程序的时候会小程序会执行onLaunch方法,执行完之后执行onload方法,但是当我们在onLaunch方法里执行异步操作,例如调用wx.login、使用request调用后台接口,就不能保证onLaunch方法中所有调用方法执行完成后执行onload。当我们在onload方法中需要onLaunch方法中获取的某些数据时,会导致数据获取不到。
我一开始想的使用promise解决异步问题,但是不行,promise只能保证后台接口一个一个调用,但是整个promise走下来还是异步的,他不能保证onLaunch执行完之后执行onload
var callBack=null;
onLaunch() {
//获取数据相关代码
//如果onload先执行,那么执行回调
if(app.callBack){
app.callBack();
}
},
onLoad: function (options) {
//如果我需要的数据不为空
if(app.globalData.userInfo.userId!=null){
//通过是该数据进行下一步操作
that.getInfo();
}else{
//如果没有改数据,我把要执行的操作封装成一个方法,等onLaunch获取到再执行
app.callBack = that.getInfo;
}
},
整个流程就是onLaunch与onload同时执行,onLaunch执行完之后根据callBack有没有值,如果有值,证明onload已经执行完了,并且还没有获取数据,然后调用callback获取数据。
如果没有值,证明onload还没有执行,这时我们已经获取到onload所需要的数据,onload需要获取的时候就会去获取。
当然这种方法也有缺陷,如果小程序初始页面很多的话,就需要每一个页面的onload都使用这种模式,很不方便。
博主暂时想不到更好的办法,若果有大佬能只修改onlaunch代码而不动onload代码的方法,还请您不吝赐教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。