fix: 防止 SSE 客户端 done 事件触发两次
This commit is contained in:
+6
-2
@@ -41,6 +41,7 @@ const SSE = {
|
||||
const decoder = new TextDecoder();
|
||||
let buffer = '';
|
||||
let currentEvent = '';
|
||||
let doneReceived = false;
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
@@ -62,6 +63,9 @@ const SSE = {
|
||||
data = raw;
|
||||
}
|
||||
|
||||
// Track explicit done event from backend
|
||||
if (currentEvent === 'done') doneReceived = true;
|
||||
|
||||
// Call the matching handler
|
||||
if (currentEvent && handlers[currentEvent]) {
|
||||
handlers[currentEvent](data);
|
||||
@@ -70,8 +74,8 @@ const SSE = {
|
||||
}
|
||||
}
|
||||
|
||||
// Stream ended
|
||||
if (handlers.done) handlers.done();
|
||||
// Stream ended — only fire done if backend didn't send an explicit one
|
||||
if (handlers.done && !doneReceived) handlers.done();
|
||||
} catch (err) {
|
||||
if (err.name === 'AbortError') return;
|
||||
if (handlers.error) handlers.error({ message: err.message });
|
||||
|
||||
Reference in New Issue
Block a user