const CONFIG = require('../config.js') const REQUEST_CACHE = [] const API_BASE_URL = 'https://api.it120.cc' /** * 简单请求封装 * url: 请求地址 * data: 请求内容 * method: 请求方法 * cache: 缓存时长(单位: 秒) */ function FetchRequest(url, data, method = 'GET', cache = 0, header = {}, noSubDomain = false) { var request_key = GetStorageKey(url, method); if (cache) { return new Promise(Storage); } else { return new Promise(Request); } /** * 缓存相关 */ function Storage(resolve, reject) { wx.getStorage({ key: request_key, success: StorageSuccess, fail: StorageError }) /** * 成功回调 */ function StorageSuccess(store) { if (CheckCache(store.data)) { resolve(store.data); } else { Request(resolve, reject); } } /** * 异常处理 */ function StorageError(err) { Request(resolve, reject); } } /** * 请求接口 */ function Request(resolve, reject) { if (CheckRequest(request_key)) { return; } SaveRequest(request_key); let _url = API_BASE_URL + '/' + CONFIG.subDomain + url if (noSubDomain) { _url = API_BASE_URL + url } wx.request({ url: _url, method: method.toUpperCase(), data: data, header: header, success: FetchSuccess, fail: FetchError, complete: RequestOver }) /** * 成功回调 */ function FetchSuccess(res) { SaveCache(res); if (res.statusCode >= 200 && res.statusCode < 300) { resolve(res); } else { FetchError(res.data); switch (res.statusCode) { case 403: // 业务逻辑处理 break } } } /** * 异常处理 */ function FetchError(err) { if (err) { wx.showToast({ title: err.errMsg || err.message, icon: 'none', duration: 3000 }) } reject(err); } } /** * 保存缓存信息 */ function SaveCache(res) { if (cache > 0 && res.statusCode >= 200 && res.statusCode < 300) { res.timestamp = Date.parse(new Date()) + cache * 1000; wx.setStorage({ key: GetStorageKey(url, method), data: res, }) } } /** * 验证缓存是否过期 */ function CheckCache(data) { return data.timestamp < Date.parse(new Date()); } function RequestOver() { RemoveRequest(request_key); } } /** * 并发请求 * 没做缓存等处理 */ function FetchRequestAll(data) { return new Promise(function (resolve, reject) { Promise.all(data).then(res => { resolve(res) }) }) } function CheckRequest(key) { return REQUEST_CACHE.indexOf(key) >= 0; } function SaveRequest(key) { var index = REQUEST_CACHE.indexOf(key); if (index <= 0) { REQUEST_CACHE.push(key); } } function RemoveRequest(key) { var index = REQUEST_CACHE.indexOf(key); if (index >= 0) { REQUEST_CACHE.splice(index, 1); } } function GetStorageKey(url, method) { return `${method.toUpperCase()}:${url.toUpperCase()}` } /** * 小程序的promise没有finally方法,自己扩展下 */ Promise.prototype.finally = function (callback) { var Promise = this.constructor; return this.then( function (value) { Promise.resolve(callback()).then( function () { return value; } ); }, function (reason) { Promise.resolve(callback()).then( function () { throw reason; } ); } ); } module.exports = { fetchRequest: FetchRequest, cacheTime: 1800, fetchRequestAll: FetchRequestAll }