You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:17:51