sse 和 fetch
// requestFetch.ts
export class FetchAiStream {
controllerAbort: AbortController;
constructor() {
this.controllerAbort = new AbortController();
}
fetchStream(url: string, params: any) {
const { onmessage, onabort, onclose, headers, ...otherParams } = params;
// 错误处理程序
const errorHandler = (err: any) => {
if (err.message.includes("aborted")) {
onabort(err);
} else {
console.log(`错误信息:${err.message ?? "未知错误"}`);
}
};
const push = async (controller: any, reader: ReadableStreamDefaultReader) => {
try {
const { value, done } = await reader.read();
if (done) {
controller.close();
onclose?.();
} else {
onmessage?.(new TextDecoder().decode(value));
controller.enqueue(value);
push(controller, reader);
}
} catch (err: any) {
// controller.console;
errorHandler(err);
}
};
// 发送请求
return fetch(url, {
signal: this.controllerAbort.signal,
headers: { "Content-Type": "application/json", ...headers },
...otherParams,
})
.then((response: Response) => {
// 以ReadableStream解析数据
const reader = response.body?.getReader();
const stream = new ReadableStream({
start(controller) {
push(controller, reader);
},
});
return stream;
})
.then((stream) => new Response(stream, { headers: { "Content-Type": "text/html" } }).text())
.catch((err: Error) => {
errorHandler(err);
});
}
abort() {
this.controllerAbort.abort();
}
}Last updated