接口类型
DefaultFile
typescript
type DefaultFile = {
id: string
name: string
url: string
}
RequestData 上传接口默认参数
ts
type RequestData = {
[name]: blob // chunk二进制数据, name是配置中的名称,默认是file
hash: string // 文件hash
id: string // chunk id
fileId: string // file id
index: number // 从0开始
filename: string
size: number
totalSize: number
totalChunks: number
}
Request
ts
export function request(options) {
const {
method = 'POST',
withCredentials = true,
responseType = 'json',
action,
data,
query,
headers,
name,
onSuccess,
onFail,
onProgress
} = options
let xhr = new XMLHttpRequest()
xhr.responseType = responseType
xhr.withCredentials = withCredentials
xhr.open(method, action, true)
const formData = new FormData()
Object.entries(data).forEach(([key, value]) => formData.append(key, value))
// 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED
if ('setRequestHeader' in xhr) {
Object.entries(headers).forEach(([key, value]) => xhr.setRequestHeader(key, value))
}
xhr.addEventListener('timeout', () => onFail(new Error('Request timed out'), xhr))
xhr.upload.addEventListener('progress', onProgress)
xhr.addEventListener('error', onFail, false)
xhr.addEventListener('readystatechange', (e) => {
if (xhr.readyState !== 4) return
if (xhr.status < 200 || xhr.status >= 300) {
onFail(new Error(`xhr: status === ${xhr.status}`), xhr)
return
}
onSuccess(e, xhr)
})
xhr.send(formData)
return {
abort() {
xhr.abort()
xhr = null
}
}
}
CustomRequestOption
ts
type CustomRequestOption = {
action: string
name: string
withCredentials: boolean
headers: object
data: RequestData
query: object
onSuccess: (e, response) => void
onFail: (e) => void
onProgress: (e) => void
}