createRefetchContainer的refetch方法未执行回调问题咨询
排查createRefetchContainer refetch回调不执行的问题
我之前在使用Relay的createRefetchContainer时也碰到过refetch回调没触发的情况,结合你的代码和常见坑点,给你几个排查方向:
1. 确认refetch方法的回调参数是否正确传递
Relay的refetch方法回调的传递方式很容易搞错,你要确保是按正确的参数顺序或者options对象来传:
方式一:按参数顺序传递
this.props.relay.refetch( { show: true }, // 变量 null, // renderVariables(可选,一般传null) () => { console.log("Refetch完成!"); // 你的回调逻辑 }, (error) => { console.error("Refetch失败:", error); } );
方式二:用options对象传递(更清晰)
this.props.relay.refetch( { show: true }, { onCompleted: () => { /* 你的回调逻辑 */ }, onError: (err) => { /* 错误处理 */ } } );
如果只是调用了this.props.relay.refetch({show: true})而没加回调参数,那自然不会执行任何回调。
2. 检查GraphQL请求的状态和变量匹配
- 打开浏览器Network面板,找到对应的GraphQL请求,看看它的状态是不是200,响应里有没有错误。如果请求失败了但你没处理
onError回调,就会误以为回调没执行。 - 确认你传递给
refetch的变量类型和refetch query定义的一致:你的refetch query里$show是Boolean!(必填),调用时一定要传合法的布尔值,不能传undefined或者其他类型。
3. 检查组件是否在请求完成前被卸载
如果调用refetch后,组件很快被卸载(比如用户跳转到其他页面),那Relay会取消这个请求,回调自然不会触发。这种情况可以:
- 在组件卸载时取消未完成的请求(比如用
useEffect的清理函数,或者类组件的componentWillUnmount) - 在回调里先检查组件是否还挂载(比如类组件里用
this._isMounted标记)
4. 强制Relay发送请求(绕过缓存)
Relay默认会用缓存策略,如果它认为请求的数据和缓存里的一致,可能不会发起实际的网络请求,这时候onCompleted可能不会触发。你可以在refetch的options里加上force: true强制发请求:
this.props.relay.refetch( { show: true }, { force: true, onCompleted: () => { /* 回调逻辑 */ } } );
5. 检查Relay版本是否存在已知bug
如果用的是比较旧的Relay Modern版本,可能存在refetch回调不触发的已知问题。建议升级到最新的稳定版本,看看问题是否解决。
内容的提问来源于stack exchange,提问作者jouerai
相关产品推荐
相关产品推荐

