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

如何在useEffect()React挂钩[duplicate]中使用await关键字

江睿
2023-03-14

我想在useeffect)中调用几个异步函数,但我不确定如何包含await关键字以等待它们的结果

// somewhere else func1 and func2 are defined
async function func1() {...};
async function func2() {...};


// func1, func2 are imported into file of functional Component
...
useEffect(() => {
    async function foo() {
        func1();
    };
    async function bar() {
        func2();
    }
    if (...) {
        await Promise.all([foo(), bar()]);
        ...
    }
    ...
}, [])
...

这给了我

意外的保留字“await”

如何在useEffect()await异步函数?

共有2个答案

郭阳曜
2023-03-14

这就该来招数了:

// somewhere else func1 and func2 are defined
async function func1() {...};
async function func2() {...};


// func1, func2 are imported into file of functional Component
...
useEffect(async () => {
    async function foo() {
        await func1();
    };
    async function bar() {
        await func2();
    }
    if (...) {
        await Promise.all([foo(), bar()]);
        ...
    }
    ...
}, [])
...

编辑:您还可以直接使用func1()func2():

...
useEffect(async () => {
    if (...) {
        await Promise.all([func1(), func2()]);
        ...
    }
    ...
}, [])
...
饶德本
2023-03-14

您可以在useEffect中创建一个匿名函数,并使其异步化,如

useEffect(() => {
    async function foo() {
        func1();
    };
    async function bar() {
        func2();
    }
    (async function() {
       if (...) {
           await Promise.all([foo(), bar()]);
           ...
        }
       ...
    
    })();
    
}, []);

或以更清洁的方式

useEffect(() => {
    async function foo() {
        func1();
    };
    async function bar() {
        func2();
    }
    async function execute() {
       if (...) {
           await Promise.all([foo(), bar()]);
           ...
        }
       ... 
       // any code that you would have normally added 
       // in useEffect callback will now be a part of execute function
    }
    execute();
    
}, [])
 类似资料:
  • 我试图创建一个简单的组件,从Apollo GraphQL服务器(查询)返回我的所有组织。我想从一个上下文状态呈现所有这些组织,在这个上下文状态下,在组件挂载(由useEffect挂钩处理)之后,可以使用分派方法放置这些组织。 如果状态结果(organizations数组)为空,useEffect钩子应该调用函数getOrganizations,然后调用自定义钩子useGetOrganization

  • 如何使用钩子(或任何其他钩子)来复制? 在传统的类组件中,我将执行以下操作: 使用hook: (完整示例:https://codesandbox.io/s/2oo7zqzx1n) 这不起作用,因为在中返回的“cleanup”函数捕获装载期间的道具,而不是卸载期间的道具状态。 如何在不运行函数体(或清除)的情况下对每个道具更改进行清理? 一个类似的问题并没有涉及获得最新道具的部分。 文件状态为: 如

  • 问题内容: 我正在学习有关如何使用钩子注册事件的Udemy课程,讲师给出了以下代码: 现在效果很好,但我不认为这是正确的方法。原因是,如果我理解正确,则每次重新渲染时,事件都会每次都在注册和注销,并且我根本认为这样做不是正确的方法。 所以我对下面的钩子做了一些修改 通过使用一个空数组作为第二个参数,使组件只运行一次效果,即模仿。当我尝试结果时,奇怪的是,在我键入的每个键上都没有附加,而是被覆盖了。

  • 有人能解释一下我做错了什么吗?我有一个react功能组件,在其中我使用useEffect钩子从服务器获取一些数据,并将这些数据放入状态值。在获取数据之后,在同一个useHook中,我需要使用该状态值,但由于某些原因,该值是明确的。看看我的示例,console有一个空字符串,但在浏览器上我可以看到该值。 链接到codesandbox。

  • 我需要与contentful集成,并且很难获得嵌套的JSON数据 当我这样做时,我得到了想要的结果: 因此,当我尝试它时,我得到一个错误消息,没有定义响应: 谢谢你的帮助

  • 问题内容: 根据文档: 更新发生后立即调用。初始渲染不调用此方法。 我们可以使用新的钩子来模拟,但似乎在每次渲染后都被运行,即使是第一次也是如此。如何使它不在初始渲染上运行? 如您在下面的示例中看到的那样,它是在初始渲染期间打印的,但在初始渲染期间没有打印的。 问题答案: 我们可以使用该钩子来存储我们喜欢的任何可变值,因此我们可以使用它来跟踪函数是否是第一次运行。 如果我们希望效果在与该效果相同的