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); } }) }); }
