首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用RXJS的并行请求会对性能有更好的影响吗?

使用RXJS的并行请求会对性能有更好的影响吗?
EN

Stack Overflow用户
提问于 2019-05-23 00:06:12
回答 4查看 605关注 0票数 2

问题:我需要用简单的XHR请求下载大文件(5-10 be ),为了简化我需要做的一个问题-至少: 100个请求(可能更多)。我想使用RXJS (并行http请求)来提高它的性能。

问题:

  1. 有没有可能通过并行来提高性能?
  2. 并行化请求不会等同于对请求循环的每次迭代使用一个请求?带宽是一样的-不是吗?
  3. 有没有其他方法来提高我的性能?

堆栈:

  • Angular 7.2.x
  • Typescript 3.2.4
  • Rxjs 6.4.0

我真正想要的是:我真正需要的是在mergeMap上应用同步来触发它的开/关。例如,我有100个one,但我不希望它们运行到最后一个。

例如,我希望它运行到17日,但会暂停发出请求,并等待特定的逻辑和请求完成。

代码示例:

代码语言:javascript
复制
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停止,直到最后一个请求运行完毕。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56260967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档