我有一个后端,作为206个部分内容的块返回大文件。我有逻辑:
fetch(url, query)
.then((resp)=>resp.json())
.then(...)但是,由于服务器没有返回完整的json对象,所以代码失败了。
是否有一些常用的库来解决这个问题(猴键盘获取),还是应该编写服务工作者或代理?为什么默认浏览器fetch不支持获取完整对象?
发布于 2022-02-14 16:05:36
JSON解析在部分对象上失败并不奇怪。fetch只是要获取您所要求的内容(好吧,接下来是重定向),所以如果query有请求部分响应的选项,那么您将得到这样的结果。
您可以构建JSON字符串,直到您有了要解析的完整响应,如下所示:
async function getAll() {
// Start with a blank string
let json = "";
do {
// Get this chunk
const resp = await fetch(url, /*...query for next chunk...*/);
if (!resp.ok && resp.status !== 206) {
throw new Error(`HTTP error ${resp.status}`);
}
// Read this chunk as text and append it to the JSON
json += await resp.text();
} while (resp.status === 206);
return JSON.parse(json);
}显然,这是一个粗略的草图,您需要处理Range头,等等。
该代码还依次请求每个块,在请求下一个块之前等待块到达。如果您事先知道块大小是什么,那么您可能能够并行化它,尽管它会更复杂,块可能会偏离顺序,等等。
它还假设服务器不会抛出一个曲线球,就像给您一个比您要求的范围更大的范围,这与您已经收到的内容重叠。如果这是一个真正的关注,您将需要为它添加逻辑。
https://stackoverflow.com/questions/71114513
复制相似问题