openid的获取顺序
在任何一个page里,需要用到openid,获取顺序为:
1、globalData;2、缓存Storage;3、云函数login
小程序编译配置:
1、不勾选es6转es5;2、不勾选增强编译;
代码如下:
app.js:
globalData: {},
getOpenidOnlyCloud: async function () { return this.globalData.openid = this.globalData.openid || (await wx.cloud.callFunction({ name: 'login' })).result.OPENID},//获取openid顺序:globalData--storage--云函数logingetOpenid: async function () { (this.globalData.openid = this.globalData.openid || wx.getStorageSync('openid')) || wx.setStorageSync('openid', this.globalData.openid = (await wx.cloud.callFunction({ name: 'login' })).result.OPENID) return this.globalData.openid}, |
任何page:
onLoad: async function () { this.openid = await app.getOpenid() console.log(this.openid)}, |
云函数login:
const cloud = require('wx-server-sdk')cloud.init()exports.main = (event) => { return { ...event,...cloud.getWXContext()} }//可同时支持返回openid和处理cloudID,获取电话号码和群ID等信息。 |
达到的效果:
1、一定获取openid成功;
2、任何异步情况可支持;
3、任何用户永久只调用一次login;
4、任何用户每次重载小程序只读取一次缓存;
另:
1、为什么不在app.js的onLaunch里获取一下openid就行了?
因为虽然app.onLaunch一定比page.onLoad更早执行,但并不保证app.onLaunch的所有代码都比page.onLoad更早执行。在page里读取globalData.openid的时候,有可能app.onLaunch里从后台获取globalData.openid的代码还没有执行完并返回真值。
2、我为什么要选择globalData–storage–云函数的顺序?
因为openid只要获取一次就行,保存在storage还是合理的,每次都调用云函数login那也是钱啊。
