
Fetch + ReadableStream
- 支持 POST 请求和自定义请求头
- 能处理任意格式的流式数据
复制代码
* 通用流式请求方法 —— 返回一个异步可迭代对象
* @param {string} url 请求地址
* @param {RequestInit} [options] fetch 的配置项(method、headers、body、signal 等)
* @returns {AsyncGenerator<string, void, unknown>} 异步生成器,每次 yield 一个解码后的文本块
*/
async function* createStreamIterator(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8', { stream: true });
while (true) {
const { done, value } = await reader.read();
if (done) break;
yield decoder.decode(value, { stream: true });
}
}
const controller = new AbortController();
const iterator = createStreamIterator('/api/stream', { signal: controller.signal });
for await (const chunk of iterator) {
}