waitForAllConnectionsDone method

Future<void> waitForAllConnectionsDone()

等待所有连接完成

返回一个 Future,当所有当前存在的连接都完成(onDone 被调用)时 resolve

注意:

  • 只等待调用此方法时已存在的连接
  • 如果在此方法调用后新增了连接,不会等待新连接
  • 如果所有连接都已断开,立即返回

示例:

final manager = http.sseManager();

// 建立多个连接
await manager.connect(id: 'chat1', ...);
await manager.connect(id: 'chat2', ...);
await manager.connect(id: 'chat3', ...);

// 等待所有连接完成
await manager.waitForAllConnectionsDone();
print('所有连接都已完成');

Implementation

Future<void> waitForAllConnectionsDone() async {
  // 如果没有连接,立即返回
  if (_connections.isEmpty) {
    return;
  }

  // 获取当前所有连接的 ID(快照,避免在等待过程中连接变化)
  final connectionIds = _connections.keys.toList();

  // 为每个连接创建 Completer(如果还没有)
  // 注意:正常情况下,Completer 应该在 connect() 时创建
  // 这里只是防御性处理,确保每个连接都有 Completer
  for (final id in connectionIds) {
    if (!_connectionCompleters.containsKey(id)) {
      // 如果 Completer 不存在,创建一个新的
      // 注意:如果连接已经完成,markConnectionDone 应该已经创建并完成了 Completer
      // 但为了防御性处理,这里也创建一个(如果连接已完成,会在 Future.wait() 中立即返回)
      _connectionCompleters[id] = Completer<void>();
    }
  }

  try {
    // 等待所有连接完成
    await Future.wait(
      connectionIds.map((id) {
        final completer = _connectionCompleters[id];
        if (completer == null) {
          // 防御性处理:如果 Completer 不存在,返回已完成的 Future
          return Future<void>.value();
        }
        return completer.future;
      }),
    );
  } finally {
    // 等待完成后,清理这些连接的 Completer
    _cleanupConnectionCompleters(connectionIds);
  }
}