使用POST获取后端依次传来的数据流(EventStream)

请求数据并处理,使用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值