namespace Http {
const RETRY: number = 5;//失败重试次数
const TIMEOUT: number = 3000;//超时时间(毫秒)
export enum Method {
GET = 'GET',
POST = 'POST'
}
export type Config = {
method?: Method;
responseType?: XMLHttpRequestResponseType;
}
export function send(url: string, data?: Document | XMLHttpRequestBodyInit, config?: Config): Promise<any> {
const promise: Promise<any> = new Promise((resolve, reject) => {
var timeoutKey: number;
var retry = RETRY;
const send = () => {
const httpRequest = new XMLHttpRequest();
const method: Method = config ? config.method || Method.GET : Method.GET;
const responseType: XMLHttpRequestResponseType = config ? config.responseType : null;
responseType && (httpRequest.responseType = responseType);
// httpRequest.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
httpRequest.onreadystatechange = (event: Event): void => {
const readyState = httpRequest.readyState;
if (readyState !== 4) return;
if (!timeoutKey) return;//已通知超时,之后收到数据后也不处理
clearTimeout(timeoutKey);
timeoutKey = null;
const requestStatus = httpRequest.status;
if (requestStatus >= 200 && requestStatus < 400) {
resolve(httpRequest.response);
}
else if (retry-- > 0) send();
else reject(new Error());
}
httpRequest.open(method, url, true);
data ? httpRequest.send(data) : httpRequest.send();
timeoutKey = setTimeout(() => {
timeoutKey = null;
httpRequest.abort();
reject(new Error(`Timeout`));
}, TIMEOUT);
}
send();
})
return promise;
}
}
export default Http;