在命令中发出observable直到第一次返回错误

时间:2018-05-13 16:55:09

标签: angular rxjs observable

我有一个案例,有时会返回未知数量的图像链接。 图片网址将始终以“p [页码] .png”结尾,例如:p1.png,p2.png等。

我想做的是循环10个最大项目并从服务器获取图像,直到返回第一个404 - 然后我想存储“有问题”的项目。

最佳方法是什么? 我以为使用forkJoin然后它会立即发出数组的所有成员,而且我没有跟踪“有问题”的请求。

谢谢!

1 个答案:

答案 0 :(得分:1)

我结束了从图像加载和错误事件创建2个observable,合并它们和订阅。对于寻找类似解决方案的任何人,这里是代码:

updatePages(pdfPages: PdfImgPage[]){
    if(this.utilService.pagesAmountUnknown){
      let imgUrls = [];
      pdfPages.forEach(page => { imgUrls.push(this.utilService.getImgUrl(page.imgSrc))});
      let imgAmount = 0;
      from(imgUrls)
        .pipe(
          concatMap(url => {
            let img = new Image();
            img.src = url;
            const load = fromEvent(img, 'load').pipe();
            const error = fromEvent(img, 'error').pipe(switchMap(errorEvent => throwError(errorEvent)));
            return merge(load,error).pipe(take(1)); //to not wait for completion
          })
        )
        .subscribe(
          img => {
            this.logger.debug(`IMAGE in CONCAT MAP`, img);
            imgAmount++;
          },
          error => {
            this.logger.debug(`ERROR in CONCAT MAP imgAmount=${imgAmount}`, error);
            this.completeFunc(imgAmount);
          },
          () => {
            this.logger.debug(`COMPLETE in CONCAT MAP`);
          }
        );
    }