本文不是Promise超时重试,而是XHR异步请求与Promise结合后的自动重连
- 如何发现请求超时?依靠XHR自身就有的超时属性和事件
var xhr = new XMLHttpRequest();
xhr.open('GET', '/server', true);
// 1. timeout属性:超时时间,单位是毫秒
xhr.timeout = 2000;
xhr.onload = function () {
/* onload事件请求完成 */ };
// 2. ontimeout事件回调
xhr.ontimeout = function (e) {
/* 请求超时处理函数 */ };
xhr.send(null);
注:onload可被认为是onreadystatechange中确认到readyState == 4,但这只能说明服务器无异常 却不保证返回数据,因此status in [200, 300)仍然需要在回调函数内部进行判断
- 那么用Promise封装带超时处理的XHR函数代码示例如下:
const newRequest = (url, timeout) => {
return new Promise((resolve, reject)