-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy path_fetch.js
executable file
·150 lines (146 loc) · 4.16 KB
/
_fetch.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
144
145
146
147
148
149
150
/**
* fetch 封装,timeout,cancel;
========================
const p = $get(
"https://api.apiopen.top/getJoke",
{
page: 1,
count: 2,
type: "video"
},
{
credentials: "omit",
headers: {
"Content-Type": "text/plain"
}
}
);
console.log(p);
p.then(res => {
console.log("res:::", res);
}).catch(err => {
console.log("err:::", err);
});
// 手动取消请求
p.cancel();
*/
import { qsStringify } from './index';
// 默认超时:30s
const defaultTimeout = 30 * 1000;
// 默认url
const defaultURL = '';
// 默认fetch配置
const defaultConfig = {
credentials: 'include',
mode: 'cors',
cache: 'default',
headers: {
'Content-Type': 'application/json'
}
};
// 校验status状态码
const checkStatus = (reject, response) => {
const response2json = response.json();
if (response.status >= 200 && response.status < 300) {
console.log('response2json: ', response2json);
return response2json;
} else {
reject(response2json);
}
};
export const _fetch = (
(fetch) =>
(url, { timeout = defaultTimeout, ...rest }) => {
console.log(url, { timeout, ...rest });
// 定义终止函数
let Abort = null;
// 可被终止(reject)的promise
const abort_promise = new Promise((resolve, reject) => {
Abort = (msg = 'canceled.') => {
reject(msg);
};
});
// 调用超时
if (timeout && typeof abort === 'function') {
setTimeout(() => {
Abort(`timeout:${timeout}ms`);
}, timeout);
}
// 业务API的promise
const fetch_promise = new Promise((resolve, reject) => {
if (!url.startsWith('http')) {
url = `${defaultURL}${url}`;
}
fetch(url, rest)
.then((response) => checkStatus(reject, response))
.then((data) => {
resolve(data);
})
.catch((error) => {
console.log('request fail url:', url);
console.log('request fail reason:', error);
reject(error);
});
});
// race:返回最快的结果(resolve/reject)
const promise = Promise.race([fetch_promise, abort_promise]);
// console.log(promise)
// 将终止函数作为结果返回,达到可取手动取消请求的目的
promise.cancel = Abort;
return promise;
}
)(fetch);
export const generateConfig = (method, params, config) => {
const finalConfig = { ...defaultConfig };
if (method === 'GET') {
Object.assign(finalConfig, { method }, config);
} else if (method === 'POST' || method === 'PUT' || method === 'DELETE') {
const body = JSON.stringify(params);
Object.assign(finalConfig, { method }, { body }, config);
} else if (method === 'UPLOAD') {
const formData = new FormData();
if (!params.length) {
return { success: false, message: '未选择文件' };
}
for (const i of params) {
const path = i.path;
const arr = path.split('/');
const file = {
uri: path,
type: 'multipart/form-data',
name: escape(arr[arr.length - 1]),
fileType: i.mime
};
formData.append('file', file);
}
Object.assign(
finalConfig,
{ method: 'POST' },
{ headers: { 'Content-Type': 'multipart/form-data' } },
{ body: formData },
config
);
}
return finalConfig;
};
export const $get = (url, params = {}, config = {}) => {
url = `${url}?${qsStringify(params)}`;
const finalConfig = generateConfig('GET', params, config);
return _fetch(url, finalConfig);
};
export const $post = (url, params = {}, config = {}) => {
const finalConfig = generateConfig('POST', params, config);
return _fetch(url, finalConfig);
};
export const $put = (url, params = {}, config = {}) => {
const finalConfig = generateConfig('PUT', params, config);
return _fetch(url, finalConfig);
};
export const $delete = (url, params = {}, config = {}) => {
const finalConfig = generateConfig('DELETE', params, config);
return _fetch(url, finalConfig);
};
export const $upload = (url, fileArr = [], config = {}) => {
const finalConfig = generateConfig('UPLOAD', fileArr, config);
return _fetch(url, finalConfig);
};