定义回调函数
在首页判断一下当前 app.globalData.employ 是否有值,如果没有,说明是第一次调用,则定义一个 回调函数
1
| app.employCallback = employ => {...}
|
在首页里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const app = getApp()
Page({ onLoad(ops) { if (app.globalData.employ) { this.getOpenIdTap(ops) } else { app.employCallback = employ => { if (employ !== '') { this.getOpenIdTap(ops) } } } }
getOpenIdTap(ops) { ... } })
|
在 App 页面在请求 success 后判断时候是否有 Page 页面定义的回调方法,如果有就执行该方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| App({ globalData: { openid: '', employ: '' }, onLaunch(ops) { if (!wx.cloud) { console.error('请使用 2.2.3 或以上的基础库以使用云能力') } else { wx.cloud.init({ traceUser: true, }) }
wx.cloud.callFunction({ name: 'login', data: {}, success: res => { const OPEN_ID = res.result.openid this.globalData.openid = OPEN_ID wx.setStorageSync("OPEN_ID", OPEN_ID) this.globalData.employ = true if (this.employCallback) { this.employCallback(true) } }, fail: err => { console.error(err) } }) } })
|
这样就可以实现我们想要的顺序:
[App] onLaunch => [Page] onLoad => [App] onLaunch sucess callback
补充
从云函数返回 openid 到小程序客户端,作为用户的标识,这样的做法不是十分安全,我们最好自己后端再生成一个 uuid 作为用户唯一ID,然后跟 openid 绑定,直接用 openid 确实有危险,因为唯一ID基本上是公开的,比如点击用户主页什么的都会明文。