UNPKG

vue-moo

Version:

moo

81 lines (75 loc) 2.4 kB
import axios from 'axios'; import util from '../../util'; const { def, hasPromise } = util.Assert; export default class Http { constructor(set = {}) { return this.init(set); } // 配置Http实例 init(set) { this.access = def(set.access, []); this.domain = def(set.domain, ''); this.fakeDelay = def(set.fakeDelay, 1000); this.setHeaders = def(set.setHeaders, params => params); this.setPayload = def(set.setPayload, params => params); this.sender = def(set.sender, null); this.METHOD = '_HRM'; this.QUERY = '_HRQ'; this.BODY = '_HRB'; return this.register(); } // 注册Remote实例方法 register() { const { access } = this; const list = {}; access.map((item) => { list[item.name] = this.request(item); return item; }); return list; } // 自动文本协议 autoContentType(data) { if (data instanceof FormData) return 'multipart/form-data'; if (typeof data === 'object' && data !== null) return 'application/json'; return 'text/plain'; } // 创建axios的payload createPayload(path, method, query, body, data) { const headers = { 'Content-Type': this.autoContentType(data), }; return this.setPayload({ url: `${this.domain}${path}`, method, headers: this.setHeaders(headers), params: data instanceof FormData ? data : Object.assign({}, query, method === 'POST' ? {} : data), data: data instanceof FormData ? data : Object.assign({}, body, method !== 'POST' ? {} : data), }); } // 请求 request(item) { const { sender, fakeDelay } = this; const { METHOD, QUERY, BODY } = this; const { name, method, path, fake } = item; return (params = {}) => { const rm = params[METHOD] || method; const rq = params[QUERY] || {}; const rb = params[BODY] || {}; delete params[METHOD]; delete params[QUERY]; delete params[BODY]; const payload = this.createPayload(path, rm, rq, rb, params); const req = (pl) => { if (fake !== null) { return new Promise(resolve => { setTimeout(() => resolve(fake), fakeDelay); }); } return !sender ? axios(pl) : sender(pl); } // 假设payload返回的是一个promise return payload && hasPromise(payload) ? payload.then(set => req(set)) : req(payload); }; } }