EP-WachatApp/lib/SRequest.js

124 lines
2.8 KiB
JavaScript

class Interceptor {
handlerId = 1
constructor() {
this.id = Interceptor.id++
this.handlers = []
}
use(success, fail) {
this.handlers.push({
id: this.handlerId,
success,
fail
})
return this.handlerId++
}
eject(handlerId) {
for (let i = 0; i < this.handlers.length; i++) {
if (this.handlers[i].id === handlerId) {
return this.handlers.splice(i, 1)
}
}
}
go(config, isSuccess) {
if(!isSuccess){
return this.handlers[0].fail(config)
}else{
for (const v of this.handlers) {
config = v.success(config)
}
return config
}
}
}
Interceptor.id = 1
function isHttpSuccess(status){
return status >= 200 && status < 300 || status === 304
}
class SRequest {
config = {
baseUrl:'',
dataType: 'json',
responseType: 'text',
header: {},
}
constructor(config) {
this.config = Object.assign(this.config, config)
this.interceptors = {
request: new Interceptor(),
response: new Interceptor()
}
}
request(config) {
config = config ? Object.assign({}, this.config, config) : this.config
config = this.interceptReq(config, true)
let { url, method, data, header, dataType, responseType } = config
if (!url.startsWith('https://')) {
url = config.baseUrl + url
}
return new Promise((resolve, reject) => {
wx.request({
url,
data,
header: header || this.header,
method,
dataType,
responseType,
success: res => {
if(isHttpSuccess(res.statusCode)){
res = this.interceptRes(res, true)
resolve(res.data)
}else{
res = this.interceptRes(res, false)
reject(res)
}
},
fail: res => {
res = this.interceptRes(res, false)
reject(res)
},
})
})
}
// 遍历请求拦截器
interceptReq(config, isSuccess) {
return this.interceptors.request.go(config, isSuccess)
}
// 遍历响应拦截器
interceptRes(response, isSuccess) {
return this.interceptors.response.go(response, isSuccess)
}
get(url, config) {
const options = { url, method: 'GET' }
Object.assign(options, config || null)
return this.request(options)
}
post(url, data, config) {
const options = { url, method: 'POST' }
Object.assign(options, data ? { data } : null, config || null)
return this.request(options)
}
put(url, data, config) {
const options = { url, method: 'PUT' }
Object.assign(options, data ? { data } : null, config || null)
return this.request(options)
}
delete(url, config) {
const options = { url, method: 'DELETE' }
Object.assign(options, config || null)
return this.request(options)
}
}
module.exports = SRequest