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

Zustand组件外部调用setState未更新,循环中retry_n始终为0

问题描述

我在store.js中按常规方式定义了Zustand的retryStore:

const retryStore = create(set => ({
    retry_n: 0,
    setGRetry: (retry_n) => set(state => ({
        ...state,
        retry_n,
    })),
}));
export { retryStore };

随后在@/utils/get.js文件中尝试在循环内将retry_n的值加1,代码如下:

const retry_n = retryStore.getState().retry_n
const xxx = xxxStore.getState().xxx
const xxxx = xxxxStore.getState().xxxx

var j=0;
const maxretry = 20;

const myFetch = async () => {
    try {
        let url = `...`

        while(j < maxretry){

            console.log('while try n:',j)     // 输出1,2,3...等
            console.log('get.js retry_n:',retry_n)  // 始终输出0
            
            if (isItRetry){            // 此处为TRUE
                retryStore.setState({ retry_n: retry_n + 1})
                console.log('playThis retry_n now:',retry_n)    // 始终输出0
            }else{
                ...
            }

            if (a != b){ ... return }

            j++
        }
        etc...

按预期每次循环retry_n应递增1,但实际始终为0,同文件内其他store用相同方式操作均正常,请问这是什么原因?

问题原因及解决方案
  • 核心原因:你在代码开头把retryStore.getState().retry_n赋值给了局部常量retry_n,这个值是初始化时读取的固定值,后续循环里一直用这个初始的0来计算更新。哪怕store内部的retry_n已经被修改,这个局部常量也不会自动同步最新值。

  • 解决方案:

    1. 循环内实时读取store值:每次需要使用retry_n时,直接从store中获取最新状态,而不是依赖开头定义的局部变量:
      while(j < maxretry){
          // 每次循环都获取最新的retry_n
          const currentRetry = retryStore.getState().retry_n
          console.log('get.js retry_n:', currentRetry)
          
          if (isItRetry){
              retryStore.setState({ retry_n: currentRetry + 1})
              console.log('playThis retry_n now:', retryStore.getState().retry_n)
          }
          // ...其他逻辑
          j++
      }
      
    2. 利用store内置的更新方法:你已经定义了setGRetry,可以直接调用它并传入函数来基于当前state计算新值,这种写法更可靠,避免局部变量的缓存问题:
      if (isItRetry){
          // 传入函数,基于当前state的retry_n计算新值
          retryStore.getState().setGRetry(prevRetry => prevRetry + 1)
          console.log('playThis retry_n now:', retryStore.getState().retry_n)
      }
      

内容的提问来源于stack exchange,提问作者Nathan Bernard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:09:11