需要確保登陸後在進行數據請求,這不就是靜默登錄麼?
只有首次註冊登錄的用戶需要提供用戶信息,其他時候都是靜默登錄。
什麼叫靜默登錄?
這篇文章值得參考。其中第四點,靜默登錄的調用時機:小程序啓動時調用和接口請求發起時調用。由於微信小程序onlaunch
不是每次都啓動的(5min
內屬於熱啓動好像),所以考慮第二種方案:只在接口請求發起時調用。
但是必須要先解決下面的問題:
- 如果想在接口請求發起時調用,那就得把登錄流程單獨拿出來或者放到請求頁面一起。
- 如果想在登錄完成後還能重新發起之前失敗的請求,得有
callback
/異步函數。 - 如果登錄失敗了還要繼續登錄麼?
查了會資料,思考了一會,準備這樣解決:
- 現在的請求已經是單獨封裝的了,登錄沒其他地方用到,放請求裏一起封裝
- 異步函數用promise,成功失敗都可以有回調,而且不會亂套,按順序執行
- 登陸失敗給個提示,簡單點。當然也可以限制登錄失敗的次數,超過X次就提示:登錄失敗,服務器問題。
於是,着手改造,最終是下面這樣:
const baseUrl = '';
import API from './api'
const wxLogin = (name, data, resolve) => {
let self = this;
uni.login({
provider: 'weixin',
success: function(loginRes) {
if (loginRes.errMsg === 'login:ok') {
request('wxlogin', {
code: loginRes.code
}).then(res => {
if (res) {
//todo.....
resolve(request(name, data));
} else {
uni.showModal({
content: res.msg,
showCancel: false
});
}
});
} else {
uni.showModal({
content: '登陸失敗',
showCancel: false
});
}
}
});
};
const request = (name = '', data = {}) => {
if (!name) {
uni.showToast({
title: '暫無該請求',
duration: 2000
});
return;
}
let {
url = '', method = 'GET'
} = API[name];
let header = {};
const sessionID = uni.getStorageSync('sessionID');
if (sessionID) {
header['cookie'] = sessionID;
}
return new Promise((resolve, reject) => {
uni.request({
method,
url: baseUrl + url,
data: data,
header: header,
dataType: 'json',
}).then((response) => {
let [error, res] = response;
if (error) {
uni.showToast({
icon: 'none',
title: error.errMsg,
duration: 2000
});
reject(error)
} else if (res.statusCode === 403) {
wxLogin(name, data, resolve)
} else {
if (url.indexOf('wxlogin') !== -1 && res.cookies && res.cookies[0]) {
const id = res.cookies[0].split(';')[0];
uni.setStorageSync('sessionID', id);
}
resolve(res.data);
}
}).catch(error => {
let [err, res] = error;
uni.showToast({
title: '請求失敗',
duration: 2000
});
})
})
}
export default request
運行試下,靜默登錄已經實現,回調也沒有問題,有問題的是頁面存在多個請求的問題:
首頁有多個請求的時候會實現多次登錄
感覺不太好,於是就把多個請求提出一個初始請求出來,其他請求放在這個初始請求之後,就可以了。