请老师看看还有什么要完善的地方
来源:11-8 Promise的正确用法

runzx
2018-08-22
通过这次课的收获, 结合前面全栈课内容,对小程序 http及用户身份token认证模块,我这几天重新精简,合并和重构后,在实用角度,请老师给些意见, 代码如下:
/** * 翟享 20180821 * 昆明,重构base * promise, cache,token * cachetime默认为0,不缓存。单位:秒 * 通过times33生成缓存key */ import { restUrl, api, appkey, tips } from './config' import { times33 } from './hash' class HTTP { constructor(app = getApp()) { // App()页getApp()无效,此时用this传入app,其它页面可以不用传参数 this.noRefetch = false this.app = app this.app.globalData.token || (this.app.globalData.token = wx.getStorageSync('token')) } request({ url, data = {}, method = 'GET', cachetime = 0 }) { return new Promise((resolve, reject) => { // 缓存判断 if (cachetime) { let key = this._getKey(url, method, data), cacheData = wx.getStorageSync(key), timeStamp = Date.parse(new Date()) if (cacheData && cacheData.data) { if (cacheData.expire > timeStamp) { return resolve(cacheData.data) } wx.removeStorageSync(key) } } this._request({ url, resolve, reject, data, method, cachetime }) }) } _getKey(url, method, data) { let bid = this.app.globalData.bid, str = JSON.stringify(data) bid || (bid = '0') str = times33(url + method + bid + str) + '' // wx只认string return str } _request({ url, resolve, reject, data, method, cachetime }) { wx.showNavigationBarLoading() wx.request({ url: restUrl + url, method, data, header: { 'content-type': 'application/json', 'appkey': appkey, 'authorization': 'zhai_token ' + this.app.globalData.token, // 'bisid': this.app.globalData.bisInfo.id }, success: res => { let code = res.statusCode.toString() if (code.startsWith('2')) { resolve(res) this.noRefetch = false // console.log('--res--',res) this._processSuccess({ url, method, data,resData: res.data, cachetime }) } else { if (code === '401' && !this.noRefetch) this._refetch({ url, resolve, reject, data, method }) else { reject() this._processError(res) } } }, fail: err => { reject() this._processError(err) }, complete: res => { wx.hideNavigationBarLoading() wx.hideLoading() } }) } _refetch(params) { this.getToken().then(res => { this.noRefetch = true this._request(params) }) } _processSuccess({ url, method, data, resData,cachetime }) { if (cachetime) { let key = this._getKey(url, method, data), cacheData = { data: resData, expire: Date.parse(new Date()) + cachetime * 1000, } wx.setStorageSync(key, cacheData) } } _processError(err) { let msg = (err.data ? err.data.msg : false) || err.errMsg || '发生了一个错误' let code = err.statusCode, errMsg = tips[code] ? tips[code] : msg wx.showToast({ title: errMsg, icon: 'none', duration: 5000 }) } // 从server取token, getToken() { return new Promise((resolve, reject) => { // 上传userInfo, globalData上没有从缓存取 this.app.globalData.userInfo || (this.app.globalData.userInfo = wx.getStorageSync('userInfo') || {}) wx.login({ success: res => { this.request({ url: api.login, data: { code: res.code, userInfo: this.app.globalData.userInfo }, method: 'POST' }).then(result => { this.app.globalData.token = result.data.token wx.setStorageSync('token', result.data.token) wx.setStorageSync('userData', result.data) this.app.globalData.isLoggedIn || (this.app.globalData.isLoggedIn = true) resolve(result.data) }).catch(err => { reject() if (err.errMes === 'request:fail') { wx.showModal({ title: '警告', content: '你的网络环境差' }) } }) } }) }) } } export { HTTP }
写回答
6回答
-
runzx
提问者
2018-09-24
我这是根据老师的设计理念,自己改写,这是我第4次重构。
多回头看,再对照老师讲的,就会有收获。
00 -
前端小白2018
2018-09-23
这么厉害!!!
收藏下。
00 -
runzx
提问者
2018-08-22
token通过服务器生成,我是根据全栈课里的用小程序 code码从微信服务器认证后数据生成,我用redis缓存,设定生命周期2小时 //生成令牌 static generateToken() { let randChar = this.randomWord(false, 32); let timestamp = Date.now(); let tokenSalt = secure.token_salt; //salt盐 return this.md5(randChar + timestamp + tokenSalt); }
00 -
7七月
2018-08-22
都想拉你来做开源了
00 -
7七月
2018-08-22
风格上没什么问题。key还好,jwt token有很长。其实 服务器 这种key是有问题的,最好能够实现refresh token 刷新令牌
00 -
runzx
提问者
2018-08-22
对缓存key用hash生成,会不会画蛇添足?
如果直接返回 可能很长的字符串key, 对缓存读取速度会有多大影响?
042018-08-23
相似问题