指数补偿
在网络环境不稳定的情况下,以指数级别的时间间隔发送请求,直到任意某一次请求得到了返回
function request(url) {
// 判断是否已经完成请求
let resolved = false;
// 次数
let t = 1;
return new Promise((resolve, reject) => {
function doFetch() {
// 如果已经完成请求,或者次数已达上限,则直接返回
if (resolved || t > 16) {
return;
}
// 否则发送请求
fetch(url).then((resp) => {
// 如果标记还处在未完成的状态
if (!resolved) {
// 将结果返回
resolve(resp);
// 将标记置为已完成
resolved = true;
}
});
// 指数级的时间间隔发送请求
setTimeout(() => {
// 调用自己
doFetch();
t *= 2;
}, t * 100);
}
// 首次调用
doFetch();
});
}