看着是个 setInterval
,实际是个 setTimeout
。
function setIntervalWaitable(callback, ms = 0) {
// 参数校验省略
const fn = (async () => {
try {
await callback();
} catch (err) {
console.error(err);
}
setTimeout(fn, ms); // 递归调用
});
setTimeout(fn, ms); // 立即触发一次
}
测试结果(模拟 AJAX 请求阻塞 5 秒,上一次请求结束后等 5 秒再开始下一次,即 5+5=10):
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…