/** * 通用网络请求工具 * - 自动 loading / hideLoading * - 自动 fail 错误提示 * - Promise 风格,支持 async/await * - code != 200 自动 toast 并 reject */ const app = getApp() // 请求计数,支持并发 loading let requestCount = 0 /** * @param {object} opts * @param {string} opts.url - API 路径(不含 baseUrl) * @param {string} opts.method - GET/POST,默认 GET * @param {object} opts.data - 请求参数 * @param {boolean} opts.loading - 是否显示 loading,默认 true * @param {string} opts.loadingText - loading 文案,默认 "加载中..." * @param {boolean} opts.showError - 失败时是否自动 toast,默认 true * @param {object} opts.header - 自定义 header(会合并默认 header) * @returns {Promise} res.data - 响应体 { code, msg, data } */ function request(opts) { const { url, method = 'GET', data = {}, loading = true, loadingText = '加载中...', showError = true, header = {} } = opts if (loading) { if (requestCount === 0) { wx.showLoading({ title: loadingText, mask: true }) } requestCount++ } return new Promise((resolve, reject) => { wx.request({ url: app.globalData.url + url, method, data, header: { 'content-type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer ' + app.getCache('token'), ...header }, success(res) { if (res.data.code === 200) { resolve(res.data) } else { if (showError) { wx.showToast({ title: res.data.msg || '请求失败', icon: 'none', duration: 2000 }) } reject(res.data) } }, fail(err) { if (showError) { wx.showToast({ title: '网络异常,请稍后重试', icon: 'none', duration: 2000 }) } reject(err) }, complete() { if (loading) { requestCount-- if (requestCount <= 0) { requestCount = 0 wx.hideLoading() } } } }) }) } module.exports = { request }