请求数据并处理,使用while循环依次接收数据
/**
* fetch请求的方法
*/
async function request(url,data){
// 接收后端的字节流最好使用浏览器自带的请求方法,我使用axios进行下面操作就报错了
return await fetch(url,{
method:"post", // 请求的方式
body:JSON.stringify(data) // 携带的数据
})
}
let res = request("xxx",{id:"123"});
const reader = res.body.getReader();
while(1){
// 解构方式获取数据,done:是否读取结束,为true则读流结束,value:内容
const {done,value} = await reader.read();
while(done){
console.log("当前数据已读完");
break;
}
// 创建字节解码器
const decoder = new TextDecoder();
// 将Uint8Array的数组进行解码
let txt = decoder.decode(value);
// 解码后的数据是纯string的串,一般用JSON.parse来变成json格式会报错的,使用自己封装的转JSON方法
let json = parseMultiJson(txt);
console.log(json);
}
解析JSON数据的方法,因为有时候后端返回的可能是多个对象的字符串,直接使用JSON.parse来解析会出错
/**
* 百度盗的,用来将string解析为JSON的方法
* @params jsonStr {a: 1}{a: 2}{a: 3}
*/
function parseMultiJson(jsonStr) {
const jsonArr = [];
let startIndex = 0;
let endIndex = 0;
while (startIndex < jsonStr.length) {
// 找到一个 JSON 对象的开始位置
startIndex = jsonStr.indexOf('{', startIndex);
if (startIndex === -1) {
break;
}
// 找到一个 JSON 对象的结束位置
let openBrackets = 1;
endIndex = startIndex + 1;
while (openBrackets > 0 && endIndex < jsonStr.length) {
if (jsonStr[endIndex] === '{') {
openBrackets++;
} else if (jsonStr[endIndex] === '}') {
openBrackets--;
}
endIndex++;
}
// 将该 JSON 对象解析为一个对象,并添加到数组中
const json = jsonStr.substring(startIndex, endIndex);
jsonArr.push(JSON.parse(json));
// 更新下一个 JSON 对象的开始位置
startIndex = endIndex;
}
return jsonArr;
}