Reactjs 尝试在API响应上设置值字符串时,useState和useRecoilState返回undefined

Reactjs 尝试在API响应上设置值字符串时,useState和useRecoilState返回undefined,reactjs,use-state,Reactjs,Use State,我遇到了useState和useRecoilState的一个大问题。 特别是,我使用DELETE方法调用restapi,该调用返回一个jobId,以便将来能够轮询以了解该作业的状态。 调用成功,响应正确返回,但是当我尝试设置“ReturnJobId”状态时,它将变为未定义状态。不会返回控制台错误或警告。 我试过使用反应状态和反冲状态,它们都有相同的结果。 我希望状态设置正确,因为它是一个简单的字符串。下面是一段有问题的代码。 正如您从代码中看到的,有问题的变量“returnedJobId”被初始

我遇到了useState和useRecoilState的一个大问题。 特别是,我使用DELETE方法调用restapi,该调用返回一个jobId,以便将来能够轮询以了解该作业的状态。 调用成功,响应正确返回,但是当我尝试设置“ReturnJobId”状态时,它将变为未定义状态。不会返回控制台错误或警告。 我试过使用反应状态和反冲状态,它们都有相同的结果。 我希望状态设置正确,因为它是一个简单的字符串。下面是一段有问题的代码。 正如您从代码中看到的,有问题的变量“returnedJobId”被初始化为null,但在尝试设置它之后,它将变得未定义。 这甚至不是一个计时问题,我尝试在几秒钟后创建控制台日志,但状态仍然未定义。 提前感谢任何试图帮助我的人

const [returnedJobId, setReturnedJobId] = useState(null);
fetch(basePath + "/digital/cpes/" + cpeToReset + "/redreset", {
            method: 'DELETE',
            headers: {
                federationId: userFederationId
            }
        }).then(res => res.json())
            .then(data => {
                console.log("Dati ordine di reset: ", data);
                if (data.code !== 200) {
                    setIsResetting(false);
                    console.log("Response code errato: ", data.code);
                } else {
                    console.log("Ordine di reset OK");
                    setReturnedJobId(data.jobId); /*This is the problematic instruction */
                    console.warn('Setto il seguente job id: ', data.jobId);
                    setTimeout(() => {
                        console.log("Stato del job id: ", returnedJobId); /*Here is undefined*/
                    }, 1000);

                }
            })

我假设
returnedJobId
是与
setReturnedJobId
状态更新程序对应的值。我还假设您在
setTimeout
中记录状态,因为您知道状态更新不会立即发生。您仍然有问题的原因是由于过时的关闭

请注意,如果正确声明了状态,
returnedJobId
是一个
const
。常量
不能更改。即使您延迟了变量的日志记录,它仍然是一个
常量
,永远不会更新

useState
的工作方式是在下一次渲染时捕获新状态的值。在功能组件中,下一次渲染对应于React调用该功能组件的下一次渲染。当调用任何函数(组件或其他)时,所有局部变量都是全新的。先前渲染的局部变量将被销毁,并在其位置创建新的局部变量
useState
非常有用,因为它将传递给updater函数的值分配给新的
const
。它有更新
常量的错觉,但实际上它是一个全新的变量

因此,无论发生什么情况,都无法在当前渲染期间获取状态的新值。你必须等到下一个。最常用的方法是使用
useffect

useffect(()=>{
log(“Stato del作业id:”,returnedJobId);
},[returnedJobId]);

我假设
returnedJobId
是与
setReturnedJobId
状态更新程序对应的值。我还假设您在
setTimeout
中记录状态,因为您知道状态更新不会立即发生。您仍然有问题的原因是由于过时的关闭

请注意,如果正确声明了状态,
returnedJobId
是一个
const
。常量
不能更改。即使您延迟了变量的日志记录,它仍然是一个
常量
,永远不会更新

useState
的工作方式是在下一次渲染时捕获新状态的值。在功能组件中,下一次渲染对应于React调用该功能组件的下一次渲染。当调用任何
函数(组件或其他)时,所有局部变量都是全新的。先前渲染的局部变量将被销毁,并在其位置创建新的局部变量
useState
非常有用,因为它将传递给updater函数的值分配给新的
const
。它有更新
常量的错觉,但实际上它是一个全新的变量

因此,无论发生什么情况,都无法在当前渲染期间获取状态的新值。你必须等到下一个。最常用的方法是使用
useffect

useffect(()=>{
log(“Stato del作业id:”,returnedJobId);
},[returnedJobId]);

更新后,我很好奇,控制台日志的结果是什么?我希望最后一个显示为
null
而不是
未定义的
,因为您已将其初始化为空。原因是我拥有所有未使用的逻辑,所有这些逻辑都必须通过单击按钮触发。在您的建议之后,我只移动了useEffect中的“轮询”逻辑,并且变量和变量在您的更新之后被正确更新,我很好奇,您的控制台日志的结果是什么?我希望最后一个显示为
null
而不是
未定义的
,因为您已将其初始化为空。原因是我拥有所有未使用的逻辑,所有这些逻辑都必须通过单击按钮触发。根据您的建议,我只移动了useEffect中的“轮询”逻辑,并且变量和变量被正确更新