jquery - 处理多个 ajax 请求 - 仅使用最后一个请求
问题描述
我们有一个日历应用程序,用户可以在其中单击右箭头或左箭头以移动到下一个月或上个月。单击其中一个箭头会调用 jquery ajax 来加载和绘制相关的月份信息(整个过程大约需要一秒钟)。
如果用户需要在一个方向移动五六个月,他们通常会很快点击箭头,从而进行多次 ajax 调用。
如果他们的处理尚未完成并且只处理最新的呼叫,那么“放弃”所有先前呼叫的最佳方式是什么?
例如,如果日历显示一月并且用户快速单击五次以显示六月,则应避免处理(客户端)二月 - 五月。
解决方案
一种可能性是每个 API 调用都通过 a 进行路由Promise.race
,它使用 API 调用和另一个构造Promise
,如果在当前调用解析之前进行了另一个 API 调用,则该构造会拒绝。例如:
// API call resolves after 800 ms:
const apiCall = () => new Promise(res => setTimeout(res, 800, 'foobar'));
let lastReject;
function doCall() {
if (lastReject) lastReject();
Promise.race([
apiCall(),
new Promise((_, rej) => {
lastReject = rej;
})
])
.then((resp) => {
console.log('API response: ' + resp);
})
.catch(() => {
console.log('Quick click: previous ongoing API call will be ignored');
});
}
document.querySelector('input').onclick = doCall;
<input type="button" value="Click to make API call">
推荐阅读
- jquery - 单击 Href 链接时使 Jquery Datatable 单元格可编辑
- javascript - 如何在JS中的另一个函数中执行一个函数
- java - Android Volley 获取请求,我的 onResponse 永远不会被调用
- azure-devops - Azure DevOps 代码审查电子邮件未列出要审查的文件
- c# - 需要显示具有自定义对齐方式的列表视图项
- wpf - WPF 日历中 PART_HeaderButton 的 NullReferenceException
- python - 如何将关键事件发送到python中的非活动窗口
- java - 执行appium脚本时遇到javapath错误
- python - 作为 groupby 查询的结果,如何从 DF 中删除行?
- php - 如何将此 RewriteRule 重定向到正确的页面?