1
1
import { Component , Input , OnInit } from '@angular/core' ;
2
2
import { FileService } from '../../services/file.service' ;
3
3
import { defer , from , Observable } from 'rxjs' ;
4
- import { map , mergeAll } from 'rxjs/operators' ;
4
+ import { concatAll , map , mergeAll , retry } from 'rxjs/operators' ;
5
5
import { Base64ArrayBuffer } from './Base64ArrayBuffer' ;
6
6
7
7
@Component ( {
@@ -13,6 +13,8 @@ export class ImageGridComponent implements OnInit {
13
13
14
14
fileList : Array < string > = [ ] ;
15
15
16
+ static readonly RETRY_COUNT = 5 ;
17
+
16
18
static readonly FETCH_MODE_CONCAT = 'CONCAT' ;
17
19
static readonly FETCH_MODE_MERGE = 'MERGE' ;
18
20
static readonly FETCH_MODE_MERGERETRY = 'MERGE RETRY' ;
@@ -21,6 +23,8 @@ export class ImageGridComponent implements OnInit {
21
23
@Input ( ) title : string = '' ;
22
24
23
25
images : Array < string > = [ ] ;
26
+ imageFetchError ?: string ;
27
+ imageFetchErrorFilename ?: string ;
24
28
25
29
constructor ( private fileService : FileService ) {
26
30
}
@@ -29,24 +33,64 @@ export class ImageGridComponent implements OnInit {
29
33
this . loadList ( ) ;
30
34
}
31
35
32
- loadImages ( ) : Observable < void > {
36
+ loadImagesConcatAll ( ) : Observable < void > {
37
+ return new Observable ( subscriber => {
38
+ from ( this . fileList )
39
+ . pipe (
40
+ map ( ( file : string ) => defer ( ( ) => this . fileService . getFile ( file ) ) ) ,
41
+ concatAll ( )
42
+ )
43
+ . subscribe (
44
+ ( fileResponse : ArrayBuffer ) => {
45
+ this . images . push ( 'data:image/png;base64,' + Base64ArrayBuffer . encode ( fileResponse ) ) ;
46
+ } ,
47
+ ( err : any ) => {
48
+ subscriber . error ( err ) ;
49
+ } ,
50
+ ( ) => {
51
+ console . log ( `loadImagesConcatAll() COMPLETE!` ) ;
52
+ }
53
+ ) ;
54
+ } ) ;
55
+ }
56
+
57
+ loadImagesMergeAll ( ) : Observable < void > {
33
58
return new Observable ( subscriber => {
34
59
from ( this . fileList )
35
60
. pipe (
36
61
map ( ( file : string ) => defer ( ( ) => this . fileService . getFile ( file ) ) ) ,
37
- //concatAll()
38
62
mergeAll ( 20 )
39
63
)
40
64
. subscribe (
41
65
( fileResponse : ArrayBuffer ) => {
42
66
this . images . push ( 'data:image/png;base64,' + Base64ArrayBuffer . encode ( fileResponse ) ) ;
43
67
} ,
44
68
( err : any ) => {
45
- console . error ( `LOADIMAGES ERROR1: ${ JSON . stringify ( err , null , 2 ) } ` ) ;
46
69
subscriber . error ( err ) ;
47
70
} ,
48
71
( ) => {
49
- console . log ( `LOADIMAGES COMPLETE!` ) ;
72
+ console . log ( `loadImagesMergeAll() COMPLETE!` ) ;
73
+ }
74
+ ) ;
75
+ } ) ;
76
+ }
77
+
78
+ loadImagesMergeAllWithRetry ( ) : Observable < void > {
79
+ return new Observable ( subscriber => {
80
+ from ( this . fileList )
81
+ . pipe (
82
+ map ( ( file : string ) => defer ( ( ) => this . fileService . getFile ( file ) . pipe ( retry ( ImageGridComponent . RETRY_COUNT ) ) ) ) ,
83
+ mergeAll ( 20 )
84
+ )
85
+ . subscribe (
86
+ ( fileResponse : ArrayBuffer ) => {
87
+ this . images . push ( 'data:image/png;base64,' + Base64ArrayBuffer . encode ( fileResponse ) ) ;
88
+ } ,
89
+ ( err : any ) => {
90
+ subscriber . error ( err ) ;
91
+ } ,
92
+ ( ) => {
93
+ console . log ( `loadImagesMergeAllWithRetry() COMPLETE!` ) ;
50
94
}
51
95
) ;
52
96
} ) ;
@@ -55,13 +99,15 @@ export class ImageGridComponent implements OnInit {
55
99
loadList ( ) : void {
56
100
this . fileList = [ ] ;
57
101
this . images = [ ] ;
102
+ this . imageFetchError = undefined ;
103
+ this . imageFetchErrorFilename = undefined ;
58
104
this . fileService . getFileList ( )
59
105
. subscribe ( s => {
60
106
this . fileList = s ;
61
- this . loadImages ( ) . subscribe ( {
107
+ this . loadImagesMergeAll ( ) . subscribe ( {
62
108
error : err => {
63
- console . error ( `LOADIMAGES ERROR2: ${ JSON . stringify ( err , null , 2 ) } ` ) ;
64
- throw err ;
109
+ this . imageFetchError = ` ${ err [ 'status' ] } ${ err [ 'statusText' ] } ` ;
110
+ this . imageFetchErrorFilename = err [ 'url' ] ;
65
111
}
66
112
} ) ;
67
113
} ) ;
0 commit comments