Излучать наблюдаемые в заказе, пока первая не вернет ошибку - PullRequest
0 голосов
/ 13 мая 2018

У меня есть случай, когда иногда возвращается неизвестное количество ссылок на изображения. URL-адреса изображений всегда заканчиваются на «p [номер страницы] .png», например, p1.png, p2.png и т. Д.

Что я хочу сделать, так это перебрать 10 макс. Элементов и получать изображения с сервера до тех пор, пока не будут возвращены первые 404, а затем я хочу сохранить «проблемный» элемент.

Каков наилучший подход для этого? Я подумал об использовании forkJoin, но затем он немедленно выдает все элементы массива, и у меня нет следов «проблемного» запроса.

Спасибо!

1 Ответ

0 голосов
/ 14 мая 2018

Я закончил создание 2 наблюдаемых из загрузки изображений и событий ошибок, объединяя их и подписываясь.Для тех, кто ищет подобное решение, вот код:

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`);
          }
        );
    }
...