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

如何多次调用useLazyQuery并传入不同变量获取对应结果?

问题原因

你遇到的问题核心是useLazyQuery返回的data是React状态变量,状态更新是异步的。在同一个async函数里,即使await了getMessage的Promise,组件此时还没完成重新渲染,data依然是当前渲染周期的旧值。两次请求完成后,data最终会被更新为最后一次请求的结果,导致两次打印的都是同一个值。

解决方案

最直接的解决方式是直接使用getMessage函数返回的Promise结果——这个Promise会在本次查询完成后resolve,返回的对象里包含了本次查询的data,完全不受组件状态更新的异步性影响。

修改后的代码如下:

const [getMessage, { data, loading, subscribeToMore }]
    = useLazyQuery(CHATBOX_QUERY, {
            fetchPolicy: 'network-only'
    });
useEffect(() => {
        async function f() {
            // 直接获取本次查询的结果
            const firstResult = await getMessage({variables: { name1: "Bonny", name2: "Mary" }})
            console.log(firstResult.data)
            
            const secondResult = await getMessage({variables: { name1: "Bonny", name2: "John" }})
            console.log(secondResult.data)
        }
        f()
}, [])

如果后续需要在组件中持久化这两次查询的结果,建议将它们存储在独立的状态变量中,避免被后续查询覆盖:

const [getMessage, { loading, subscribeToMore }]
    = useLazyQuery(CHATBOX_QUERY, {
            fetchPolicy: 'network-only'
    });
// 用独立状态存储两次查询结果
const [chat1Data, setChat1Data] = useState(null)
const [chat2Data, setChat2Data] = useState(null)

useEffect(() => {
        async function f() {
            const firstResult = await getMessage({variables: { name1: "Bonny", name2: "Mary" }})
            setChat1Data(firstResult.data)
            
            const secondResult = await getMessage({variables: { name1: "Bonny", name2: "John" }})
            setChat2Data(secondResult.data)
        }
        f()
}, [])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:50:23