在任何一个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--云函数login getOpenid: 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那也是钱啊。