这个问题描述起来确实有点难度,就是我在云函数中,使用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=>{})中执行打印,依然是等结束后才能执行。
4 个回复
DCloud_uniCloud_VK
可以参考uni-ai-chat内的源码,其已实现流式响应
DCloud_uniCloud_WYQ
打印出来的日志发出来看看,本地运行还是云端运行,日志前加上时间戳看看
其他工具说的是什么工具?
j***@qq.com
需要使用SSEChannel
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
问题解决了吗?遇到同样的问题