z***@126.com
z***@126.com
  • 发布:2023-08-02 23:52
  • 更新:2024-11-12 10:48
  • 阅读:657

uniCloud.httpClient.request返回stream流式数据为什么一直到全部接收完才能处理?

分类:uniCloud

这个问题描述起来确实有点难度,就是我在云函数中,使用uniCloud.httpClient.request获取流式数据,服务器确实是分批推送的,但总是到最后全部推送完,才能拿到数据。
例如:
服务端总共推送1000个字,分成了5次推送

正常情况下,这5次的时间间隔为:
1秒,3秒,6秒,9秒,12秒
我应该可以在以上时间点分别打印出接收到的数据。

但是实际情况是,使用下面的代码,我能开始处理接收到的数据,只能在第12秒,全部推送完成后,我的打印才会生效,在最后1秒一次性打印了5次数据记过。

代码如下:

let response = await uniCloud.httpclient.request(apiUrl, {  
        headers: headers,  
        method: 'POST',  
        data: data,  
        timeout:600000,  
        streaming: true  
    });  

    let i = 0  
    response.res.on('data', data=>{  
        console.log('第' + i + '个数据包');  
        i += 1  
        console.log(data.toString('utf8'))  
    })  

    response.res.on('end', ()=>{  
        console.log('消息接收完毕');  
    })

注意:之所以说服务端确实是分批推送,是因为我用其他工具测试,确实是可以在收到数据立刻打印出来的。

请问各位大佬,是unicloud的机制如此,就是一直要等所有数据返回完成,才继续执行后面的打印代码吗?

那有没有解决的办法呢?


  • pss: 我尝试过几个办法,都失败了
  • 办法1:不用async/await,避免是await导致了一直等待,但此时会报错response没有res.on方法,因为还没返回就执行到后面了。
  • 办法2:使用.then(res=>{})中执行打印,依然是等结束后才能执行。
2023-08-02 23:52 负责人:无 分享
已邀请:
DCloud_uniCloud_VK

DCloud_uniCloud_VK

可以参考uni-ai-chat内的源码,其已实现流式响应

DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

打印出来的日志发出来看看,本地运行还是云端运行,日志前加上时间戳看看

其他工具说的是什么工具?

j***@qq.com

j***@qq.com

  • z***@126.com (作者)

    是的

    2023-08-21 08:00

  • 1***@qq.com

    回复 z***@126.com: 请问作者最后是怎么解决的呢

    2024-06-23 13:40

  • z***@outlook.com

    这个东西好像只解决了客户端和云函数之间的流式,但是云函数调用其他接口读取别人的流式好像没有

    2024-06-29 14:03

xyzzzz

xyzzzz

问题解决了吗?遇到同样的问题

要回复问题请先登录注册