如何使用Promise确保getEventList函数始终返回数组类型?
解决getEventList()返回类型不一致的问题
这个问题我之前也碰到过,核心是要统一函数的返回类型,让调用方不用在代码里判断到底是直接拿到数组,还是要处理Promise。因为你的请求逻辑本身是异步返回Promise的,最优方案是让函数始终返回Promise<数组>,这样调用方可以用统一的异步方式处理,最终拿到的都是数组。
修改思路
不管本地缓存是否存在,都把结果包装成Promise返回:
- 如果缓存存在,用
Promise.resolve()把缓存数组转换成一个已resolved的Promise - 如果缓存不存在,直接返回原请求的Promise(它最终会resolve成数组)
修改后的代码示例
getEventList() { // 假设你是从localStorage获取缓存,记得解析成数组 const localCache = JSON.parse(localStorage.getItem('eventList')); if (localCache && Array.isArray(localCache)) { // 把缓存数组包装成Promise返回 return Promise.resolve(localCache); } // 缓存不存在时,返回请求的Promise return this.request({ url: '/event/v1/list' }); }
调用方式(统一且简洁)
现在你可以用async/await或者.then()统一处理,不用关心数据来源:
// 用async/await async function handleEvents() { try { const eventList = await this.getEventList(); // 这里eventList一定是数组,不管来自缓存还是后端请求 console.log('事件列表:', eventList); } catch (err) { console.error('获取事件列表失败:', err); } } // 或者用.then() this.getEventList() .then(eventList => { console.log('事件列表:', eventList); }) .catch(err => { console.error('获取事件列表失败:', err); });
可选优化:缓存过期处理
如果需要给缓存加过期时间,可以在存缓存的时候同时记录过期时间,比如:
// 存缓存时 localStorage.setItem('eventList', JSON.stringify(eventList)); localStorage.setItem('eventListExpire', Date.now() + 3600 * 1000); // 1小时过期 // 取缓存时判断是否过期 const expireTime = parseInt(localStorage.getItem('eventListExpire')); if (localCache && Array.isArray(localCache) && Date.now() < expireTime) { return Promise.resolve(localCache); }
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

