You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js组件开发报错:Unhandled Runtime Error: destroy is not a function

问题原因

useEffect的回调函数不能直接传入async函数。因为async函数执行后会返回一个Promise对象,而React要求useEffect的返回值要么是一个清理函数(destroy函数),要么是undefined。当React尝试把这个Promise当作清理函数调用时,就会抛出TypeError: destroy is not a function的错误。

解决方案

方法1:在useEffect内部定义async函数并调用

把异步逻辑封装到内部的async函数中,再在useEffect里执行:

"use client"
import { useEffect, useState} from "react";

export default function Page() {
    const [items, setItems] = useState([]);

    useEffect(() => {
        const fetchItems = async () => {
            const response = await fetch("http://localhost:8080/items");
            const data = await response.json();
            setItems(data);
            console.log(data);
        };
        fetchItems();
    }, []);
    

    return (<>
        <div style={{textAlign: "center"}}>Welcome to Items</div>
    </>);
}

方法2:使用立即执行异步函数表达式(IIFE)

直接在useEffect里写自执行的异步函数:

"use client"
import { useEffect, useState} from "react";

export default function Page() {
    const [items, setItems] = useState([]);

    useEffect(() => {
        (async () => {
            const response = await fetch("http://localhost:8080/items");
            const data = await response.json();
            setItems(data);
            console.log(data);
        })();
    }, []);
    

    return (<>
        <div style={{textAlign: "center"}}>Welcome to Items</div>
    </>);
}

进阶:添加请求清理逻辑(可选)

如果组件可能在请求完成前卸载,为避免内存泄漏,可用AbortController取消未完成的请求:

"use client"
import { useEffect, useState} from "react";

export default function Page() {
    const [items, setItems] = useState([]);

    useEffect(() => {
        const controller = new AbortController();
        const signal = controller.signal;

        const fetchItems = async () => {
            try {
                const response = await fetch("http://localhost:8080/items", { signal });
                const data = await response.json();
                setItems(data);
                console.log(data);
            } catch (error) {
                if (error.name === "AbortError") {
                    console.log("请求已取消");
                } else {
                    console.error("请求失败:", error);
                }
            }
        };

        fetchItems();

        return () => controller.abort();
    }, []);
    

    return (<>
        <div style={{textAlign: "center"}}>Welcome to Items</div>
    </>);
}

内容的提问来源于stack exchange,提问作者Galax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:17:38