> `Promise` 本身不支持流式传输,但可以通过使用一些第三方库或自定义代码实现流式传输。下面我们使用自定义代码来实现 `Promise` 的流式传输。 ```javascript function fetchStream(url, options = {}) { return new Promise(function(resolve, reject) { const xhr = new XMLHttpRequest(); xhr.open(options.method || 'GET', url); xhr.responseType = 'arraybuffer'; xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { resolve(new Response(xhr.response, {})); } else { reject(new Error(xhr.statusText)); } }; xhr.onerror = function() { reject(new Error('网络错误')); }; xhr.onprogress = function(event) { if (event.lengthComputable) { const progress = { total: event.total, loaded: event.loaded }; if (options.onprogress) { options.onprogress(progress); } } }; xhr.send(options.body); }); } function streamToText(stream) { const reader = stream.getReader(); return new Promise(function(resolve, reject) { let data = ''; function read() { reader.read().then(function(result) { if (result.done) { resolve(data); return; } data += String.fromCharCode.apply(null, new Uint8Array(result.value)); read(); }).catch(reject); } read(); }); } // 使用示例 fetchStream('http://example.com/streamingData', { onprogress: function(progress) { console.log('下载进度:', progress.loaded / progress.total); } }).then(function(response) { console.log('请求成功:', response); return streamToText(response.body); }).then(function(data) { console.log('数据获取成功:', data); }).catch(function(error) { console.log('请求失败:', error); }); ``` 在以上代码中,首先定义了一个名为 `fetchStream` 的函数,该函数使用 `XMLHttpRequest` 对象发送请求,并返回一个` Promise` 对象。在 `Promise` 构造函数中,创建了一个 `XMLHttpRequest` 对象,并使用 `open()` 方法打开一个请求。接着设置了 `onload`、`onerror` 和 `onprogress` 事件处理函数,当请求成功时,将响应数据包装成 `Response` 对象并调用 `resolve()` 方法返回;当请求失败时,调用` reject()` 方法返回错误信息。其中,`onprogress` 事件处理函数可以用来获取下载进度。 在 `streamToText` 函数中,使用` getReader() `方法获取到一个 `ReadableStreamDefaultReader` 对象,并使用` read() `方法读取数据。读取完成后需要继续调用 `read() `方法来读取下一块数据,直到数据读取完成。 在使用` Promise` 实现流式传输时,需要注意以下几点: 使用 `XMLHttpRequest` 对象发送请求,并使用` responseType` 属性设置响应类型为 `arraybuffer`。 在获取到响应数据后,将其包装成 `Response` 对象并调用 `resolve()` 方法返回。 在获取下载进度时,使用` onprogress` 事件处理函数来获取。 在读取数据时,使用 `getReader()` 方法获取到 `ReadableStreamDefaultReader` 对象,并使用 `read() `方法读取数据,读取完成后需要继续调用 `read()` 方法来读取下一块数据,直到数据读取完成。