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

使用Redux RTK Query LazyQuery时遇报错:useLazyQuery不可迭代

问题描述

我希望在onSuccess函数中使用Redux RTK执行API请求并等待响应,此前用Axios实现毫无问题,但替换为RTK的LazyQuery时遇到了问题。

收到的异常:

useLazyQuery is not a function or its return value is not iterable

API定义

const linkAPI = overweightRTK.injectEndpoints({
    tagTypes: ['Link'],
    endpoints: (builder) => ({
        createLink: builder.mutation({
            query: (body) => ({
                url: `/links/`,
                method: 'POST',
                body,
                invalidatesTags: ['Link']
            })
        })
    }),
    overrideExisting: false
});

export const { useCreateLinkMutation} = linkAPI;

组件代码

const [trigger, result, lastPromiseInfo] = OverweightRTK.endpoints.createLink.useLazyQuery()
const onSuccess = async (data) => {
        const createLinkRequest = { 
               payload: data
        };

        trigger({ createLinkRequest }, { skip: !isSubscriber })
            .unwrap()
            .then(res => {
                if (res.status === 200) {
                    setSuccessMessage('Success, your account linked');
                }
            })
            .catch((error) => console.log(error));
    };
解决方案
  • 根本问题:你在API里定义的是Mutation(用于POST这类修改数据的请求),但组件里错误使用了useLazyQuery——RTK Query中,Query对应GET类查询请求,Mutation对应POST/PUT/DELETE类修改请求,两者的Hook不能混用。
  • 修正方案:直接使用你已经导出的useCreateLinkMutation Hook,而非调用endpoints.createLink.useLazyQuery

修正后的组件代码:

// 导入已导出的Mutation Hook
import { useCreateLinkMutation } from './你的API文件路径';

const YourComponent = () => {
    // useCreateLinkMutation 返回 [触发函数, 请求状态对象]
    const [createLink, { isLoading, error }] = useCreateLinkMutation();

    const onSuccess = async (data) => {
        // 非订阅者直接跳过请求
        if (!isSubscriber) return;

        const createLinkRequest = { 
            payload: data
        };

        try {
            const res = await createLink(createLinkRequest).unwrap();
            // RTK会自动解析响应,无需额外判断status===200
            setSuccessMessage('Success, your account linked');
        } catch (error) {
            console.log(error);
        }
    };

    // 组件其他逻辑...
};

补充说明

  1. useLazyQuery是Query类型请求的专属Hook,用于延迟触发GET查询,你的createLink是POST请求,必须用对应的Mutation Hook
  2. unwrap()方法会直接返回响应数据或抛出请求错误,用async/await写法比.then/.catch更简洁
  3. Mutation Hook不支持skip参数,跳过请求的逻辑直接在调用前判断即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:05:28