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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:35:21