爱简收旧衣按件回收前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

100 lines
2.2 KiB

// 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