javascript - 相同 URL 的 fetch 响应大小不同
问题描述
我正在使用 fetch API 从服务器 URL 获取响应,但响应大小并非每次都如此。
大多数时候我得到大小为 262144 的响应数据,但有时大小小于那个大小。像大小为 65536 和 196608 的数据。
async function fetchData() {
let url = "https://www.dl.dropboxusercontent.com/s/7d87jcsh0qodk78/fuel_64x64x64_uint8.raw?dl=1";
let response = await fetch(url);
let data = await response.body.getReader().read();
data = data.value;
if (data) {
dataBuffer = new Uint8Array(data);
console.log(data.length);
} else {
console.log("action aborted");
}
}
fetchData()
解决方案
您收到的阅读器getReader()
使用内部队列。的文档read()
说以下内容:
接口的
read()
方法ReadableStreamDefaultReader
返回一个promise ,提供对流内部队列中下一个块的访问。
多次获取最终可能会以不同的方式对远程数据进行分块,从而导致不同的长度。要读取流以完成检查由done
返回的值read()
。
async function fetchData() {
const url = "https://www.dl.dropboxusercontent.com/s/7d87jcsh0qodk78/fuel_64x64x64_uint8.raw?dl=1";
const response = await fetch(url);
const reader = response.body.getReader();
let length = 0;
let value, done;
while ({value, done} = await reader.read(), !done) {
length += value.length;
}
console.log(length);
}
fetchData()
但是,如果意图是在采取任何操作之前读取流以完成,那么您最好使用响应方法之一,例如arrayBuffer()
, blob()
, formData()
,json()
或者text()
取决于您期望的数据类型。提到的响应方法都读取响应流以完成。
async function fetchData() {
const url = "https://www.dl.dropboxusercontent.com/s/7d87jcsh0qodk78/fuel_64x64x64_uint8.raw?dl=1";
const response = await fetch(url);
const dataBuffer = new Uint8Array(await response.arrayBuffer());
console.log(dataBuffer.length);
}
fetchData()
推荐阅读
- c - 计算正弦的 C 程序给出的结果不准确
- python - 读取一个文件然后写入多个
- powershell - 以管理员身份运行 PowerShell 脚本所有参数为空
- angular - 在 Jasmine 单元测试中设置 ReactiveForm (Angular) 中 AbstractControl 的值
- java - how to create IAM role for a spring boot rest api web service deployed in aws ec2 instance
- javascript - 使用 while 循环遍历数组
- python - hashlib.sha1 函数每次调用产生不同的结果
- java - Method working only with < than 5000 args parameters
- java - JFrame如何检测去图标化是否完成
- excel - 与服务器的连接异常终止