vue-moo
Version:
moo
81 lines (75 loc) • 2.4 kB
JavaScript
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);
};
}
}