master
宇天 2020-08-06 20:08:08 +08:00
parent da3bfb4ea8
commit 4b91e552fe
1 changed files with 72 additions and 20 deletions

View File

@ -60,7 +60,7 @@ Promise.defer = function() {
class _Instance {} class _Instance {}
class _Request { class _Request {
constructor(url = '', options = { method: 'GET' }) { constructor(url = '', options = {}) {
if (!url) { if (!url) {
throw new Error(ERRORS[10001]) throw new Error(ERRORS[10001])
} }
@ -74,13 +74,16 @@ class _Request {
} }
} }
options.method = options.method.toUpperCase() options.method = (options.method || 'get').toUpperCase()
this.xhr = new XMLHttpRequest() this.xhr = new XMLHttpRequest()
this.defer = Promise.defer() this.defer = Promise.defer()
this.options = { this.options = {
headers: {}, headers: {
'X-Requested-With': 'XMLHttpRequest',
'content-type': FORM_TYPES.form
},
body: null, body: null,
cache: 'default', cache: 'default',
referrer: '', referrer: '',
@ -101,19 +104,12 @@ class _Request {
__next__() { __next__() {
var options = this.options var options = this.options
var params = null
var hasAttach = false // 是否有附件 var hasAttach = false // 是否有附件
var crossDomain = false // 是否跨域
var control = new AbortController() var control = new AbortController()
/* -------------------------------------------------------------- */
/* ------------------------ 1»» 配置头信息 ---------------------- */
/* -------------------------------------------------------------- */
if (options.headers) {
Object.assign(this.options.headers, options.headers)
if (!options.headers['content-type']) {
options.headers['content-type'] =
'application/x-www-form-urlencoded; charset=UTF-8'
}
}
/* ------------------------ 1»» 处理超时 ---------------------- */
// 如果有传入signal, 则删除timeout配置 // 如果有传入signal, 则删除timeout配置
if (options.signal) { if (options.signal) {
delete options.timeout delete options.timeout
@ -124,6 +120,67 @@ class _Request {
this.cancel = true this.cancel = true
this.xhr.abort() this.xhr.abort()
} }
/* -------------------------- 2»» 请求的内容 --------------------- */
if (options.body) {
var type = typeof options.body
switch (type) {
case 'number':
case 'string':
this.__type__('text')
params = options.body
break
case 'object':
// 解析表单DOM
if (options.body.nodeName === 'FORM') {
options.method = options.body.method.toUpperCase() || 'POST'
params = Format.parseForm(options.body)
hasAttach = params.constructor === FormData
if (hasAttach) {
delete options.headers['content-type']
}
// 如果是一个 FormData对象
// 则直接改为POST
} else if (options.body.constructor === FormData) {
hasAttach = true
options.method = 'POST'
params = options.body
delete options.headers['content-type']
} else {
// 有附件,则改为FormData
if (hasAttach) {
params = Format.mkFormData(options.body)
} else {
params = options.body
}
}
}
}
/* -------------------------- 3»» 处理跨域 --------------------- */
try {
let $a = document.createElement('a')
$a.href = options.url
crossDomain =
location.protocol !== $a.protocol || location.host !== $a.host
} catch (err) {}
if (crossDomain) {
if (options.credentials) {
this.xhr.withCredentials = true
} else {
delete options.headers['X-Requested-With']
}
}
/* ------------- 4»» 根据method类型, 处理g表单数据 ---------------- */
}
__type__(type) {
this.options.headers['content-type'] = FORM_TYPES[type]
} }
} }
@ -155,13 +212,8 @@ class _Response {
} }
} }
function _fetch(url, method = 'GET', param = {}) { function _fetch(url, param) {
// return new _Request(url, param)
if (typeof method === 'object') {
param = method
method = 'GET'
}
return new _Request(url, method, param)
} }
export default _fetch export default _fetch