promise本身不提供懒加载能力,但通过延迟创建实例(即封装为函数、按需调用)可实现懒加载;支持缓存、重试、事件触发及状态管理等扩展。

Promise 本身不直接提供“懒加载”能力,但它是非常适合构建懒加载逻辑的工具——关键在于延迟创建 Promise 实例,即只在真正需要数据时才调用异步操作(如 fetch),而不是提前执行。
懒加载的核心:函数封装 Promise
把 Promise 的创建过程包裹在一个函数里,避免立即执行。这样调用函数时才发起请求,实现按需触发。
// ❌ 非懒加载:立即执行,一定义就发请求
const userData = fetch('/api/user').then(res => res.json());
// ✅ 懒加载:返回一个函数,调用时才执行
const loadUserData = () => fetch('/api/user').then(res => res.json());
// 后续按需调用
loadUserData().then(data => console.log(data));
封装成可复用的懒加载 Promise 工厂
可以进一步抽象为通用工厂函数,支持参数、缓存、错误重试等扩展能力。
const createLazyLoader = (loaderFn, options = {}) => {
let promise = null;
const { cache = true, retry = 0 } = options;
return (...args) => {
if (cache && promise) return promise;
const run = () => loaderFn(...args).catch(err => {
if (retry > 0) return new Promise(resolve =>
setTimeout(() => resolve(run()), 100)
).then(r => r);
throw err;
});
promise = run();
return promise;
};
};
// 使用示例
const loadPost = createLazyLoader(id =>
fetch(`/api/posts/${id}`).then(r => r.json())
);
// 第一次调用才请求,后续调用复用同一个 Promise(缓存)
loadPost(123).then(post => console.log(post));
结合 DOM 交互实现真实场景懒加载
比如点击按钮才加载数据,或滚动到区域再加载图片/内容,都依赖事件触发 Promise 函数。
const loadComments = () =>
fetch('/api/comments').then(r => r.json());
document.getElementById('load-btn').addEventListener('click', () => {
loadComments()
.then(comments => renderComments(comments))
.catch(err => showError('加载失败'));
});
// 或监听 IntersectionObserver 实现“进入视口时加载”
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadComments().then(renderComments);
observer.unobserve(entry.target); // 加载后取消监听
}
});
});
observer.observe(document.getElementById('comments-section'));
注意点:避免重复请求与状态管理
懒加载不是“每次调用都重新请求”,合理设计需考虑:
- 同一资源多次调用应复用已发起的 Promise(避免竞态和重复请求)
- 加载中、成功、失败的状态建议配合 UI 反馈(如 loading spinner)
- 若需刷新数据,可提供
force: true参数清空缓存 Promise - Promises 无法取消,如需中断请改用
AbortController配合fetch
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











