alovajs/alova

[Bug]: Uniapp的 localCache mode='placeholder' 无法正确运行

Skiyee opened this issue · 7 comments

这是否是一个 Bug?

  • 我已经确认我要报告的是一个 Bug

这个问题是否已经存在?

  • 我已经确认这个 Issue 没有被报告过

Alova 版本

2.21.0

前端框架

Vue

问题描述

const getTodoList = alovaIns.Get('/todo/list', {
  localCache: {
    mode: 'placeholder',
    expire: 60 * 60 * 12 * 1000,
  },
})


const { loading, data } = useRequest(getTodoList, {
  initialData: [],
})

此时的loading一直都是true,data也为空数组,无法触发缓冲

期望的表现

请求时能够集中缓冲

复现链接

No response

复现步骤

如以上问题里描述所展示的代码

系统信息

uniapp: 3.0.0-alpha-4010920240606001
vue: 3.4.21
alova: 2.21.0
@alova/adapter-uniapp: 1.2.2

补充说明

No response

你好,没能复现你提到的问题。你的 alovaIns 的创建步骤是怎样的呢?

如果方便的话,还是建议在 CodePen 等平台提供一个可复现的项目,可以更快地定位解决问题。

你好,可能是 mock 的问题

我看持久化local storage是有储存请求的method实例的

// alovaIns

import { createAlovaMockAdapter } from '@alova/mock'
import { uniappMockResponse, uniappRequestAdapter } from '@alova/adapter-uniapp'

const mockAdapter = createAlovaMockAdapter(mockWrapper, {
  httpAdapter: uniappRequestAdapter,

  onMockResponse: uniappMockResponse,
})

export default createAlova({
  baseURL: '/api',
  timeout: 50000,
  ...AdapterUniapp({
    mockRequest: mockAdapter
  }),
})

抱歉,由于关联代码过多,我无法提供线上项目,以上都是相关的核心代码了

除了placeholder模式外,另外两个模式是正常的

如果依旧无法复现,我可以换成 restore 模式

按照你补充的代码进行测试也无法复现这个问题。这边不了解你的 mock 是如何定义的,可以试试去掉 mock 看看表现是否正常。

真实环境下也是无法 HitCache,刷新一次就请求一次

是不是我理解该模式有问题?

如果在缓冲时间内多次请求是直接展示data的,不发起真实请求
如果过期了再去发起真实请求?

谢谢回复,我换一个模式吧

你应该是理解错模式了,你的需求应该使用内存模式

placeholder 模式下,每次请求都会发出真实的请求,如果有缓存数据且未失效,则先使用旧数据占位。请求是每次都会发出的。