// api/index.js import http from './http.js' import utils from '../utils/utils.js' import config from './config.js' const limit = new Map() const debounce = new Map() // 动态导入 models const modules = import.meta.glob('./model/*.js', { eager: true }) Object.entries(modules).forEach(([path, mod]) => { const model = mod.default || mod const key = path.match(/\/([^/]+)\.js$/)[1] for (const k in model) { if (config[k]) { console.error(`重名api------model=${key},key=${k}`) // 这里建议用全局弹窗或通知 continue } config[k] = model[k] } }) /** * 通用API请求 * @param {string} key * @param {object} data * @param {function} [callback] * @param {string} [loadingTitle] * @returns {Promise} */ export function api(key, data = {}, callback, loadingTitle) { const req = config[key] if (!req) { console.error('无效key: ' + key) return Promise.reject(new Error('无效key')) } // 参数重载 if (typeof callback === 'string') { loadingTitle = callback callback = undefined } if (typeof data === 'function') { callback = data data = {} } // 限流 if (req.limit) { const last = limit.get(req.url) if (last && Date.now() - last < req.limit) { return Promise.reject(new Error('请求过于频繁')) } limit.set(req.url, Date.now()) } // console.log(!uni.getStorageSync('token'),'status'); // 必须登录 if (req.auth && !uni.getStorageSync('token')) { // utils.toLogin() return Promise.reject(new Error('需要登录')) } // 防抖 if (req.debounce) { const prev = debounce.get(req.url) if (prev) clearTimeout(prev) debounce.set( req.url, setTimeout(() => { debounce.delete(req.url) http.http( req.url, data, callback, req.method, loadingTitle || req.showLoading, loadingTitle || req.loadingTitle ) }, req.debounce) ) return Promise.reject(new Error('请求防抖中')) } // 正常请求 return http.http( req.url, data, callback, req.method, loadingTitle || req.showLoading, loadingTitle || req.loadingTitle ) } export default api