Sanity客户端listen方法返回的RxJS Observable订阅出现操作超时问题
Sanity listen方法返回RxJS Observable偶发超时问题处理方案
你遇到的偶发The operation timed out错误是Sanity实时查询的常见现象,并非配置遗漏导致:Sanity客户端listen方法创建的长连接默认带有空闲超时阈值,长时间没有数据推送时,客户端或服务端会主动断开连接抛出该错误,符合长连接的常规设计逻辑,很多开发者在低频率数据更新的业务场景下都会遇到同类问题。
以下是可直接落地的处理方案:
- 优先使用RxJS重试操作符自动重连
对超时错误做定向重试即可,不会影响正常业务逻辑,示例代码如下:import { retry } from 'rxjs/operators'; const sanityListener$ = sanityClient.listen( /* 你的查询语句 */, /* 查询参数 */, /* 原有配置 */ ).pipe( retry({ // 可根据业务需求调整重试次数,低频率场景设为无限重试也可 count: Infinity, delay: (error, attempt) => { // 仅对超时错误执行重试,其他类型错误正常抛出 if (error.message.includes('The operation timed out')) { // 指数退避逻辑,避免短时间频繁重连,最长等待时间设为5秒 return Math.min(1000 * Math.pow(2, attempt), 5000); } throw error; } }) ); // 后续按原有逻辑订阅即可 sanityListener$.subscribe(/* 你的业务处理逻辑 */) - 调长客户端超时阈值
可以在listen方法的第三个参数中主动调整超时时间,单位为毫秒,以下示例将超时调整为10分钟:sanityClient.listen(query, params, { timeout: 600000 }) - 额外注意事项
组件销毁或不需要监听时,务必调用订阅返回的unsubscribe方法销毁连接,避免内存泄漏和无效的重连逻辑执行。
内容的提问来源于stack exchange,提问作者jorgen
相关产品推荐
相关产品推荐

