预取数据时如何避免重复请求?视口滚动触发多次API调用
我在用IntersectionObserver监听元素进入视口时预取数据,但发现滚动过快时会重复发送请求。比如下面这样写:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
fetchNextPage(); // 这里会重复调用多次
observer.unobserve(entry.target);
}
});
});
试过给fetchNextPage加节流函数,但预取时机又会变慢。有没有更好的方式控制预取的触发频率,同时保证用户体验?
建议加一个状态标记,判断是否已经在请求中:
这样保证一次只发一个请求,后续的触发都会被忽略,等请求结束再恢复状态。
如果你还想进一步优化,可以把“是否已经请求过”也缓存起来,避免重复加载:
两个变量配合使用也可以,看你具体需求。总之,避免重复请求的核心是靠标记状态,别让逻辑反复进入fetch。
或者用WeakMap存状态,兼容性更好些:
WP里面常见的做法是结合数据API的缓存机制,比如在请求参数里加个时间戳,或者用wp.data.select判断是否已有缓存。不过这层控制最好放在数据层,不是监听层。IntersectionObserver这层保持简单比较好。