login(){
const that = this
wx.login({//异步1
success: (res) => {
that.getUrl('api/miniapp/index',{code:res.code}).then((res)=>{//异步2
console.log(res);
});
},
fail:(e)=>{
console.log(e);
}
})
}
......
async userlogin(){
await getApp().login();
console.log('111');
},
原本以为用了async和await之后,会先打印出登录结果,结果发现先打印的是111
后来发现login函数还存在着两个异步,await只作用于最外层的login函数,并没有作用于内部的异步。我想让他们全部变成同步的咋整?
回答:
自定义的login函数需要返回promise才能await
需要等待登录接口后进行操作 可以尝试下面的方法
app.js
login() {
wx.login().then(async (res) => {
let data = await getUrl({ code: res.code });
this.globalData.token = data.token;
wx.setStorageSync("TOKEN", data.token);
if (this.callBack) {
this.callBack();//回调函数
}
});
},
onLaunch() {
const token = wx.getStorageSync("TOKEN");
if (token) {
// ...
} else {
this.login();
}
}
somepage.js
onLoad(options) {
const token = wx.getStorageSync('TOKEN');
// 小程序是异步加载的 app.js有异步操作 onload可能会比onLaunch先执行 而获取不到onLaunch的保存的数据
// 通过回调解决此问题
if (!token) {
getApp().callBack = () => {
// do something
};
} else {
// do something
}
},
login没有返回一个Promise对象,自然是没办法通过await得到想要的结果的,改成这样就行了:
login() {
return new Promise((resolve, reject) => {
wx.login({ //异步1
success: (res) => {
this.getUrl('api/miniapp/index', {
code: res.code
})
.then((res) => { //异步2
console.log(res);
resolve(res);
});
},
fail: (e) => {
console.log(e);
reject(e);
}
})
});
}
