【问题标题】:How can I make sure that function 1 ends before function 2 starts within useeffect hook?如何确保函数 1 在函数 2 在 useeffect 钩子中开始之前结束?
【发布时间】:2020-11-24 04:41:36
【问题描述】:

我创建了一个聊天机器人,并希望在 useEffect Hook 中启动两个 Dialogflow API 调用。函数 1 和函数 2 都是异步 api 调用。想要的结果是它先完成函数 1,然后从函数 2 开始,但目前函数 2 的返回值比函数 1 快。

你知道我如何告诉函数 2 等到函数 1 返回一个值吗?

useEffect(
    () => {
      createChatSessionId();
      fetchEventAnswerFromDialogflow("Startevent" + chatId, chatId); // function 1
      fetchEventAnswerFromDialogflow("Frageevent1", chatId); // function 2
    }, // eslint-disable-next-line
    []
  );

【问题讨论】:

  • 我们可以在fetchEventAnswerFromDialogflow 中使用回调吗,否则您需要使用async -await(以下答案之一中已经存在)

标签: reactjs api async-await dialogflow-es use-effect


【解决方案1】:

API 调用是异步的。 当编译器遇到异步语句时,它不会等待它完成,而是调用下一条语句。

选项一,(使用 .then 块):-

  useEffect(
    () => {
      createChatSessionId();
      fetchEventAnswerFromDialogflow("Startevent" + chatId, chatId).then(rep=>{
      fetchEventAnswerFromDialogflow("Frageevent1", chatId);})
        .catch(err){
          console.log(err)
         }
    }, // eslint-disable-next-line
    []
  );

选项二 - 根据 ES6 使用异步等待。我建议不要将 useEffect 回调作为异步,而是在 useEffect 中创建一个新的异步函数并调用它。

useEffect(
    () => {
      createChatSessionId();
      const getData = async() =>{
         await fetchEventAnswerFromDialogflow("Startevent" + chatId, chatId);
         await fetchEventAnswerFromDialogflow("Frageevent1", chatId);  //Can remove await 
             //here, depending upon usecase
      }
      getData();
    }, // eslint-disable-next-line
    []
  );

【讨论】:

  • 如果 fetchEventAnswerFromDialogflow 没有返回承诺,使 useEffect 异步并等待函数不会做任何事情。除了使 useEffect 异步之外是不合适的Here is why
  • 请查看堆栈论坛。先前评论中提供的链接
  • 感谢链接
  • 嗯,我们今天学到了新东西!不知道useEffect 中的异步,所以我需要更改我的代码中一些被遗忘的部分。我会删除我的答案,因为你的答案是正确的。再次感谢:)
猜你喜欢
  • 2020-03-15
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多