当前位置: 首页 > 知识库问答 >
问题:

函数中的异步状态值[重复]

万嘉熙
2023-03-14

我的布局如下:

<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;

这没用。。

共有2个答案

贺雅健
2023-03-14

我不知道为什么需要在那里检索更新的状态值,因为可以继续使用局部变量。

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;
赫连明诚
2023-03-14

我记得当我第一次想用最新的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,因此可以将其省略,如下所示: 然后像以前一样做