我的布局如下:
<button onClick={joinSession}></button>
我的职能
const joinSession = () => {
//set the value this will take some time
setState({...state, session : someLibrary.initSession()})
const session = state.session;
//it's undefined so the code never gets here...
session.on('event' , () => {
console.log('hello');
})
}
const [state, setState] = useState({
session: undefined,
})
问题是我调用的函数在设置会话状态之前完成运行。在运行其余代码之前,我需要一些方法来等待状态被设置。有点像。那就好了。在类组件中,您可以使用第二个参数并将其传递给setState,但我使用的是函数组件。
我试着用一个promise:
new Promise(resolve => {
return setState({ ...state, session: OV.initSession() });
}).then(res => {
const session = ovState.session;
这没用。。
我不知道为什么需要在那里检索更新的状态值,因为可以继续使用局部变量。
const joinSession = async () => {
//set the value this will take some time
let session = await someLibrary.initSession()
setState((state)=>({...state, session}))
session.on('event' , () => {
console.log('hello');
})
}
但是,如果您仍然希望获得那里的状态,可以使用my lib(演示)中的自定义挂钩:
import React, { useState } from "react";
import { useAsyncWatcher } from "use-async-effect2";
const someLibrary = {
async initSession() {
await new Promise((resolve) => setTimeout(resolve, 1000));
return Math.random();
}
};
function TestComponent(props) {
const [state, setState] = useState({ test: 456 });
const stateWatcher = useAsyncWatcher(state);
const joinSession = async () => {
let sessionValue = await someLibrary.initSession();
setState(state=> ({ ...state, session: sessionValue }));
const currentState = await stateWatcher(); // get the updated state value
const session = currentState.session;
console.log("session", session);
};
return (
<div className="component">
<div className="caption">Test</div>
<button onClick={() => joinSession()} className="btn btn-info">
Call async fn
</button>
</div>
);
}
export default TestComponent;
我记得当我第一次想用最新的react钩子更新我的一个程序时,我和你一样感到困惑,因为我经常使用setstate
函数回调:
使用useffect
可以实现相同的行为:
在您的代码示例中:
const joinSession = async () => {
// first make sure to get session asyncrounously
const newSession = await someLibrary.initSession();
// now set it as new state
setState({...state, session : newSession})
}
useEffect(()=>{
// here we are sure that session has changed or component just loaded
if (state.session) {
// assuming state.session is a falsy value in initial state
// now we are sure that session is updated here
state.session.on('event' , () => {
console.log('hello');
})
}
}, [state.session])
我正在调用这个函数。因为它在增加值,但是当我访问它时,它返回以前的值。我想访问同一函数中最新更新的值,我应该做什么。 如何访问同一函数中的最新状态值
在我的React项目中,我正在单元测试一个调用另一个异步函数的异步函数。 尽管每次测试时,结果都是一个空的promise{},而不是预期的数据。我在网上找到了很多模拟异步“getJobStatuses”函数结果的实现,但都没有成功(显示了我在这里使用的实现)。为了测试调用它的函数(getAllJobs),模拟该函数结果的正确方法是什么
我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?
我对状态同步有问题。当我点击编辑器的外部(想要关闭它),我想把实际的文本传回给父节点(函数)。但是当我在之外单击时,状态似乎总是落后一步。(例如:如果编辑器内部有,我键入,,我键入,等等)。 如果我在编辑器外单击,将出现的实际状态,如何实现这一点?
问题内容: 我正在使用nodejs通过Mongoose从Mongodb查询数据。获取数据后,我想对该数据做一些处理,然后再将其响应给客户端。但是我无法获得返回值。在Google上浏览后,我了解到Node.js函数是异步javascript函数(非I / O阻止)。我尝试了这个Tut( 问题答案: 获得未定义值的原因是因为find函数是异步的,并且可以随时完成。在您的情况下,使用后就结束了,因此在访
问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做