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

获取Twilio Conversations中用户所有会话的未读消息总数

解决方案:Twilio Conversations 全局未读消息统计

一、核心现状

Twilio Conversations 目前没有提供直接返回用户所有会话未读总数/未读会话数的API,必须基于单会话的unreadMessagesCount来计算,但可以通过优化逻辑避免大量会话时的性能问题。

二、获取全局未读消息总数的实现

  • 初始化阶段,先拉取用户参与的活跃会话(通过Client.getConversations(),过滤status为active的会话,排除已关闭/失效的会话)
  • 用并行异步的方式批量获取每个会话的未读数,累加得到总数
  • 关键优化手段:
    • 过滤无效会话:只处理active状态的会话,减少遍历数量
    • 并行处理:用Promise.all()同时发起所有会话的未读数请求,比串行遍历效率高很多
    • 增量更新缓存:首次计算后缓存总数,后续只在会话未读状态变化时(比如收到新消息、用户标记已读)通过事件监听增量更新,不用每次都全量遍历

示例代码:

// 初始化计算全局未读总数
async function getTotalUnreadMessages() {
  const client = await Twilio.Conversations.Client.create(token);
  const activeConversations = await client.getConversations({ status: 'active' });
  
  // 并行获取所有会话的未读数
  const unreadCountList = await Promise.all(
    activeConversations.map(convo => convo.unreadMessagesCount)
  );
  
  // 累加总数
  return unreadCountList.reduce((total, count) => total + count, 0);
}

// 实时监听未读状态变化,增量更新总数
let totalUnread = await getTotalUnreadMessages();
updateBadge(totalUnread); // 更新页面徽章

client.on('conversationJoined', (conversation) => {
  // 会话已读状态更新时
  conversation.on('readHorizonUpdated', async () => {
    const newCount = await conversation.unreadMessagesCount;
    // 计算差值并更新总数
    const diff = newCount - conversation.lastUnreadCount;
    totalUnread += diff;
    conversation.lastUnreadCount = newCount;
    updateBadge(totalUnread);
  });
  // 收到新消息时(非自己发送的)
  conversation.on('messageAdded', (message) => {
    if (!message.isFromMe) {
      totalUnread += 1;
      updateBadge(totalUnread);
    }
  });
});

三、获取有未读消息的会话数量的实现

逻辑类似,只需统计unreadMessagesCount > 0的会话数:

  • 拉取活跃会话列表
  • 并行检查每个会话的未读数,筛选出有未读的会话并统计数量
  • 同样可以通过事件监听增量更新:比如某会话从无未读变有未读时,计数加1;反之减1

示例代码片段:

async function getUnreadConversationCount() {
  const activeConversations = await client.getConversations({ status: 'active' });
  const hasUnreadList = await Promise.all(
    activeConversations.map(convo => convo.unreadMessagesCount.then(count => count > 0))
  );
  // 统计有未读的会话数量
  return hasUnreadList.filter(flag => flag).length;
}

四、针对大量会话的额外优化

  • 分页拉取会话:如果用户参与的会话超过50个,用getConversations()的pageSize和pageToken参数分批加载,避免一次性拉取大量数据导致内存占用过高
  • 缓存会话列表:将活跃会话列表缓存到localStorage,下次初始化时先读取缓存,再拉取最新的会话更新,减少API调用次数
  • 延迟加载非活跃会话:对于长期未互动的会话,可以暂时不计算未读数,等用户打开会话列表时再加载,降低初始化时的性能消耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:45:50