问题:我需要用简单的XHR请求下载大文件(5-10 be ),为了简化我需要做的一个问题-至少: 100个请求(可能更多)。我想使用RXJS (并行http请求)来提高它的性能。
问题:
堆栈:
我真正想要的是:我真正需要的是在mergeMap
上应用同步来触发它的开/关。例如,我有100个one,但我不希望它们运行到最后一个。
例如,我希望它运行到17日,但会暂停发出请求,并等待特定的逻辑和请求完成。
代码示例:
from(observableQueries)
.pipe(
mergeMap(partialQuery => this.messageService.getResults(partialQuery, true), 4),
takeWhile(o => {
if (!o.isMoreResults && o.auditMessageList.length === 0) {
this.logger.log(`First page that returns false ${ o.number }`);
this.logger.log(`Count of responses that exists in array: ${ allResults.length }`);
if (!firstPageThatShouldBeStopped) {
firstPageThatShouldBeStopped = o.number;
}
if (allResults.length === firstPageThatShouldBeStopped) {
return false;
}
}
return true;
}),
retryWhen(genericRetryStrategy()),
catchError((err, caught) => {
this._alertService.error(this._translate.instant('EXPORT_TO_CSV_DOWNLOAD_ERROR'));
return throwError(err);
})
)
.subscribe(
(res: MessagesResult) => {
if (reThrowError) {
this.logger.info('Error will be thrown for e2e purposes');
throw new Error('Error will throw for e2e purposes');
}
if (res.isMoreResults && res.auditMessageList.length > 0) {
allResults[res.number] = res;
this.subject.next(true);
} else if (!res.isMoreResults && res.auditMessageList.length > 0) {
allResults[res.number] = res;
this.subject.next(true);
} else {
this.subject.next(false);
}
},
err => {
// clear subject after emitting value...
this.subject.next(true);
return this.handleError(err);
},
() => {
this.logger.info('Download file finished...');
this.logger.info('Time consumed: ', performance.now() - start);
try {
this.logger.info(`Count Responses: ${ allResults.length } `);
const allResultSorted = this._sortResults(allResults);
let counter = 0;
for (let i = 0; i < allResultSorted.length; i++) {
this.logger.info('Index: ' + i, allResultSorted[i]);
counter += allResultSorted[i].auditMessageList.length;
this.logger.info('Length OF Messages: ' + i, counter);
this.fileSaver.save(!allResultSorted[i].isMoreResults, allResultSorted[i].auditMessageList,
`audit-events_${ LOCAL_QUERY_COPY.application }_${ timestamp }_${ moment()
.tz(this._timezoneService.timezone).zoneName() }.csv`, null, headers);
}
this.subject.next(false);
} catch (e) {
this._alertService.error(this._translate.instant('EXPORT_TO_CSV_DOWNLOAD_ERROR'));
return this.handleError(e);
} finally {
// clear subject after emitting value...
this.subject.next(true);
}
}
);
代码起作用了!但问题出在冗余呼叫上。如何才能让em停止,直到最后一个请求运行完毕。
https://stackoverflow.com/questions/56260967
复制相似问题