如何为StompJS的waitForReceipt()方法设置超时或终止等待?
StompJS
waitForReceipt() 超时与主动终止方案 可以通过手动封装逻辑实现超时控制,也能主动终止等待,以下是具体实现方式:
一、添加超时机制
StompJS原生的waitForReceipt()没有内置超时功能,但可以用Promise包装该方法,配合setTimeout实现超时控制:
function waitForReceiptWithTimeout(client, receiptId, timeoutMs) { return new Promise((resolve, reject) => { // 启动超时定时器 const timeoutTimer = setTimeout(() => { reject(new Error(`回执 ${receiptId} 超时(${timeoutMs}ms)`)); // 清理订阅,避免内存泄漏 client.unsubscribe(receiptId); }, timeoutMs); // 监听回执 client.waitForReceipt(receiptId, () => { clearTimeout(timeoutTimer); resolve(); }); }); } // 调用示例 async function confirmMessageConsumption(client) { const receiptId = client.subscribe('/chat/messages', (msg) => { // 处理消息逻辑 console.log('收到消息:', msg.body); }).id; try { await waitForReceiptWithTimeout(client, receiptId, 5000); // 5秒超时 console.log('消息消费已被代理确认'); } catch (err) { console.error('确认失败:', err.message); // 可添加超时后的降级逻辑,比如重试或提示用户 } }
二、主动终止等待
如果需要在特定场景下(比如页面关闭、用户取消操作)主动终止等待,直接调用client.unsubscribe(receiptId)即可中断waitForReceipt()的监听,同时清理相关定时器:
let timeoutTimer; let targetReceiptId; async function startWaiting(client, timeoutMs) { targetReceiptId = client.subscribe('/chat/messages', (msg) => { // 消息处理逻辑 }).id; return new Promise((resolve, reject) => { timeoutTimer = setTimeout(() => { reject(new Error('等待超时')); client.unsubscribe(targetReceiptId); }, timeoutMs); client.waitForReceipt(targetReceiptId, () => { clearTimeout(timeoutTimer); resolve(); }); }); } // 主动终止等待的函数 function cancelWaiting(client) { if (timeoutTimer) clearTimeout(timeoutTimer); if (targetReceiptId) client.unsubscribe(targetReceiptId); console.log('已终止回执等待'); }
注意事项
- 无论超时还是主动终止,都要调用
unsubscribe()清理订阅,防止内存泄漏 - 超时时长需根据业务场景调整,弱网环境可适当延长
- 不同版本的StompJS(如
@stomp/stompjs)API细节可能略有差异,核心逻辑通用
内容的提问来源于stack exchange,提问作者Snap3y
相关产品推荐
相关产品推荐

