gpt4 book ai didi

angular - 对 HttpClient 结果进行长轮询并流式传输到 CSV 文件中

转载 作者:太空狗 更新时间:2023-10-29 17:32:45 24 4
gpt4 key购买 nike

问题 1:我如何实现相同的行为?但不是 Observable.interval它将被回调调用。

例如:我有 5000ms 时间间隔,但我的服务器非常慢,并且在 5000ms 之后它没有取回结果。但是下一次调用是在 5000ms 之后调用的。我不想那样。我希望在从服务器返回结果后调用下一个调用。

问题 2:如何在不一个接一个地创建多个文件的情况下立即将结果流式传输到 csv 文件。对于当前的实现,我使用 FileSaver,它适用于 IE11。我想继续使用它。有没有办法将数据流式传输到文件而不是将其收集到数组中,因为我有大数据集。像 100 万行等等...示例:

const progress = Observable.interval(1000)
.switchMap(() => this.messageService.getResults(query))
.map(messageResult => messageResult)
.subscribe((data: MessagesResult) => {
inProcess = true;
if (!data.isMoreResults && data.auditMessageList.length === 0) {
this.fileSaver.save(`result.csv`, csvData);
inProcess = false;
this.logger.info('Download file finished...');
progress.unsubscribe();
}
const start = this.filterModel.offset * this.filterModel.limit;
const rows = [...csvData];
rows.splice(start, 0, ...data.auditMessageList);
csvData = rows;
if (inProcess) {
this.logger.info('Exporting in progress...');
}
query.offset++;
}, error => this.logger.error(error));

最佳答案

正如您所发现的那样,使用 Observable.interval 不会“等待”流的其余部分。

我一般使用repeatWhendelay

const progress = Observable.defer(() => this.messageService.getResults(query))
.repeatWhen(notifications => notifications.delay(1000))
...

这是工作示例:https://jsfiddle.net/a0rz6nLv/19/

我不太理解你们其他人的代码。

不要在 subscribe 方法中使用 progress.unsubscribe();。而是考虑使用 takeWhiletakeUntil - 两者都会为您完成可观察的。

.takeWhile(data => data.isMoreResults  data.auditMessageList.length > 0)

还可以缓冲结果,例如使用 reducetoArray

.reduce((accumulator, data) => data.auditMessageList.concat(accumulator), [])

副作用最好由 do 处理运算符

.do({
next: () => {
inProgress = true;
this.logger.info('Exporting in progress...');
},
complete: () => {
inProgress = false;
this.logger.info('Download file finished...');
}
})

关于第二个问题——我不知道——你应该能够从服务器流式传输 csv。如果您无法修改服务器,也许其他人会知道如何在客户端上进行修改...

关于angular - 对 HttpClient 结果进行长轮询并流式传输到 CSV 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51728717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com