首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在几个fetch函数上使用useEffect会使它们在单击按钮之前运行,如何使用useCallback呢?

在几个fetch函数上使用useEffect会使它们在单击按钮之前运行,如何使用useCallback呢?
EN

Stack Overflow用户
提问于 2022-12-02 16:50:02
回答 1查看 17关注 0票数 0

我使用一个fetch函数在按下按钮后生成一个输出,然后在几个类似的提取函数中使用这个输出。要做到这一点,我使用了useEffect,但问题是在我按下按钮之前运行了第二个和第三个函数,单击按钮启动第一个获取函数,一旦运行,我只希望其他函数运行。否则,如果页面一打开,我就花了很多钱。

我知道我应该使用useCallback,但是用useCallback替换useEffect当然不起作用,因为它只在完成某件事情时才运行。我试图用useCallBack替换第2和第3个函数中的异步函数,如下所示:

代码语言:javascript
复制
    const getOpenAIResponse = async () => {
        openai.createCompletion({
            model: "text-davinci-003",
            prompt: "Create a unique 1-5 word name.",
            max_tokens: 256,
        }).then((response) => {
            setInputName(response.data.choices[0].text)
            getSlogan()
        })
    };

    const getStory = useCallback (() => {
        openai.createCompletion({
            model: "text-davinci-003",
            prompt: "Create a story about " + inputName + ".",
            max_tokens: 256,
        }).then((response) => {
            setInputStory(response.data.choices[0].text)
        })
        }, [inputName]);

然而,这是行不通的,它产生的故事不是基于inputName -它假定inputName是空白的。

这是我用useEffect编写的代码。

代码语言:javascript
复制
    const [inputName, setInputName] = useState('');
    const [inputStory, setInputStory] = useState('');
    const [inputDes, setInputDes] = useState('');

    const getOpenAIResponse = async () => {
        openai.createCompletion({
            model: "text-davinci-003",
            prompt: "Create a unique 1-5 word name.",
            max_tokens: 256,
        }).then((response) => {
            setInputName(response.data.choices[0].text)
        })
    };

    const getStory = async () => {
        openai.createCompletion({
            model: "text-davinci-003",
            prompt: "Create a story about " + inputName + ".",
            max_tokens: 256,
        }).then((response) => {
            setInputStory(response.data.choices[0].text)
        })
    };

    const getDescription = async () => {
        openai.createCompletion({
            model: "text-davinci-003",
            prompt: "Create a description for " + inputName + ".",
            max_tokens: 256,
        }).then((response) => {
            setInputDes(response.data.choices[0].text)
        })
    };

    useEffect(() => {
        getStory();
        getDescription();
    }, [inputName]);


<Button onClick={getOpenAIResponse}>

一旦我点击按钮,一切都会安定下来,但在我点击它之前,inputStory和inputDescription会在后台持续运行。单击按钮后,我只希望它们运行,但我需要它们依赖于inputName状态,因此它们需要等待按钮完成。

是否有一种解决方案在后台不运行第二和第三个函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-02 16:54:28

添加一个if条件,以便在输入有值时运行调用

代码语言:javascript
复制
useEffect(() => {
  if(inputName){    
    getStory();
    getDescription();
  }

}, [inputName])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74659007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档