waitForAllConnectionsDone method
等待所有连接完成
返回一个 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);
}
}