用生命谱写代码的赞歌

0%

微信小程序 onLaunch 与 onLoad 执行先后顺序

定义回调函数

在首页判断一下当前 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
// firstPage.js
const app = getApp()

Page({
onLoad(ops) {
if (app.globalData.employ) {
this.getOpenIdTap(ops)
} else {
// 由于云函数login是异步请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况,等待异步请求完成再调用getOpenIdTap
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,
})
}

// 获取用户的openid
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基本上是公开的,比如点击用户主页什么的都会明文。