app.js 爲小程序的啓動入口文件小程序
onLauch: 小程序初始化回掉,生命週期內只執行一次 onShow: 小程序打開或者從後臺喚起時的回調 onHide: 小程序從前臺進入後臺時 onError: 小程序發生腳本錯誤,或者 api 調用失敗時觸發,會帶上錯誤信息api
onLoad:註冊頁面的時候執行,只執行一次 onShow: 頁面在前臺展現時執行,顯示一次執行一次 onReady: 頁面初次渲染完成時執行,冷啓動時不執行 onHide: 頁面從前臺進入後臺 onUnload: 頁面註銷時執行緩存
我的以爲 小程序app中應該增長一個onUnload週期,頁面的銷燬現實場景我的尚未使用到bash
1. 檢查是不是登錄接口服務器
2. 判斷sessionsession
3. wx.login--》獲取tokenapp
4. 執行原有回掉ide
好處:讓後續開發者 忽略登錄流程邏輯函數
function doLogin(callback, obj) {
if (obj.isLogin) {
// 登陸接口,直接放過
// 直接放過,讓其走下去
typeof callback === "function" && callback();
} else if(session) {
// 緩存中有session
if(sessionExpireTime && new Date().getTime() > sessionExpire) {
// 若是有設置本地session緩存時間,且緩存時間已到
session = '';
doLogin(callback, obj);
} else {
typeof callback === "function" && callback();
}
} else if (logining) {
// 正在登陸中,請求輪詢稍後,避免重複調用登陸接口
flow.wait('doLoginFinished', function () {
doLogin(callback, obj);
})
} else {
// 緩存中無session
logining = true;
obj.count++;
// 記錄調用wx.login前的時間戳
// 執行login 獲取code
obj._loginStartTime = new Date().getTime();
console.log('wx.login');
wx.login({
complete: function () {
obj.count--;
// 記錄wx.login返回數據後的時間戳,用於上報
obj._loginEndTime = new Date().getTime();
if (typeof reportCGI === "function") {
reportCGI('wx_login', obj._loginStartTime, obj._loginEndTime, request);
}
typeof obj.complete === "function" && obj.count == 0 && obj.complete();
},
success: function (res) {
if (res.code) {
var data;
// codeToSession.data支持函數
// 上傳服務器操做
if (typeof codeToSession.data === "function") {
data = codeToSession.data();
} else {
data = codeToSession.data || {};
}
data[codeToSession.codeName] = res.code;
obj.count++;
requestWrapper({
url: codeToSession.url,
data: data,
method: codeToSession.method,
isLogin: true,
report: codeToSession.report || codeToSession.url,
success: function (s) {
session = s;
sessionIsFresh = true;
// 若是有設置本地session過時時間
if(sessionExpireTime) {
sessionExpire = new Date().getTime() + sessionExpireTime;
wx.setStorage({
key: sessionExpireKey,
data: sessionExpire
})
}
// 執行回掉
typeof callback === "function" && callback();
wx.setStorage({
key: sessionName,
data: session
})
},
complete: function () {
obj.count--;
typeof obj.complete === "function" && obj.count == 0 && obj.complete();
logining = false;
flow.emit('doLoginFinished');
},
fail: codeToSession.fail || null
});
} else {
fail(obj, res);
console.error(res);
// 登陸失敗,解除鎖,防止死鎖
logining = false;
flow.emit('doLoginFinished');
}
},
fail: function (res) {
fail(obj, res);
console.error(res);
// 登陸失敗,解除鎖,防止死鎖
logining = false;
flow.emit('doLoginFinished');
}
})
}
}
複製代碼
page.js
const app = new getApp()
onLoad(){
app.loginCallback = () => {
this.init()
}
}
複製代碼
這種方式能夠,並且具備頁面控制的靈活性,但靈活性帶來的就是出錯的概率會增大不少ui
login.js
werequest.login().then(function(){
let pages = getCurrentPages();
let Page = pages[pages.length - 1];//當前頁
let prevPage = pages[pages.length - 2]; //上一個頁面
prevPage.onLoad()
})
複製代碼
我的比較提交這種方式,由於其餘頁面只須要處理本身的頁面邏輯就能夠