-
Notifications
You must be signed in to change notification settings - Fork 4
/
xyios.js
143 lines (134 loc) · 4.35 KB
/
xyios.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
* XXY is open source and released under the MIT Licence.
* Copyright (c) 2017 xiexiuyue
* email : abc_xf@126.com
**/
export default (http, param) => {
let arr = []
, config
// default
config = {
cacheTime: 5, // s
MaxCacheLen: 2000,
}
param || (param = {})
return a => {
let url = a.url ? a.url : a
, createScript, createAjax
, add, del, match, clear, filter
, runningCache = false // 开启缓存
, runningJsonp = a.jsonp ? true : false // 执行native ajax
, methods = param.filtMethods // 命中格式
, oldval // 匹配若成功,返回(http、jsonp)缓存, 只返回缓存
, requestMethod = a.method ? a.method : 'get' // 请求格式
// import default params detection
// TODO ...
// import default config
Object.assign(config, param);
// exec default config
config.clearCache && clear()
if (config.MaxCacheLen && arr.length >= config.MaxCacheLen) {
arr.splice(arr.length - 1, 100)
}
// The filter method invokes the cache query
filter = (methods, requestMethod, match) => {
let running = false
methods.map(e=>{
if(e==requestMethod){
running == true
}
})
running || match()
}
// Matching successfully reads the cache
match = () => {
arr.map(e => {
if (e.url == url && (+new Date - e.t) / 1000 < config.cacheTime) {
runningCache = true
oldval = e.val
}
})
}
// add done cache
add = o => {
del(url)
arr.push({
url,
t: +new Date,
val: o.val,
})
}
// delete old cache
del = url => {
arr.map((e, i, arr) => {
if (e.url == url) {
arr.splice(i, 1)
}
})
}
// execute jsonp
createScript = (resolve, reject) => {
// debugger
try {
let vKey = a.val
, script = document.createElement("script")
, head = document.getElementsByTagName("head")[0]
, windowOldVal = window[vKey] // save golbal var
, load = () => {
script.parentNode.removeChild(script)
script = null
resolve(window[vKey])
window[vKey] = windowOldVal // recover global var
}
let be = url.indexOf('?') != -1 ? '&' : '?'
script.src = `${url}${be}var=${vKey}`
script.addEventListener('load', load)
head.appendChild(script)
} catch (error) {
reject(error)
}
}
// execute ajax
createAjax = (resolve, reject) => {
// TODO
// ...
resolve({ data: {} })
}
// clear cache
clear = url => {
url ? del(url) : arr = []
}
// control
methods ? filter(methods, requestMethod, match) : match()
return new Promise((resolve, reject) => {
switch (true) {
// Intercepts and returns the cache
case runningCache: {
resolve(oldval)
break
}
// Intercepts and execute jsonp func
case runningJsonp: {
createScript(resolve, reject)
break
}
// open promist type http request
default: {
if (!http) {
// createAjax.apply(null, [].slice.call(arguments))
createAjax(resolve, reject)
} else {
http(a).then(e => {
add({
val: e
})
resolve(e)
}).catch(e => {
reject(e)
})
}
}
}
})
}
}