6

Warum der flatMap verursacht keine nachgelagerten Reduzierungen Feuer?RxJS reduce nicht fortgesetzt

Ich habe Code wie:

handleFiles.flatMap(files => 
    Rx.Observable.from(files). 
    flatMap((file, i) => fileReader(file, i)). 
    reduce((form, file, i) => { 
    form.append('file[' + i + ']', result); 
    console.log('reduce step', file); 
    return form; 
    }, new FormData()). 
    tap(console.log.bind(console, 'after reduce')) 
). 
subscribe(console.log.bind(console, 'response')); 

Und das Problem ist, dass der Wasserhahn 'nach reduzieren' nie getroffen wird. Warum?

Das Protokoll ist wie:

reduce step [data] 
reduce step [data] 

Screenshot:

Error screenshot

Antwort

2

Wenn Dateien ein Array ist, dann verringern, sollte kündigen, wenn die beobachtbaren von Filereader zurückgegeben haben. Das Problem für diesen Code war, dass fileReader eine Observable zurückgegeben hat, die nicht abgeschlossen wurde.

10

Das Problem ist nicht in flatMap; es ist in der Art und Weise reduce funktioniert.

reduce liest in einem ganzen Strom und reduziert sie auf einen einzigen Wert, emittiert nur dann, wenn der Quellenstrom geschlossen ist. Wenn Ihr from(files) Strom nicht zu Ende, dann reduce wird nie ausgegeben seinen Wert.

Versuchen scan stattdessen verwendet; es emittiert jeden Zwischenschritt und scheint genau das zu sein, wonach Sie suchen.

+0

Dateien ist ein Array JS, schlicht und einfach. Ich habe einen Screenshot hinzugefügt. Ich hatte vorher scannen und das hat funktioniert ... Aber da es ein JS-Array ist, sollte Aggregat onComplete tun, oder? – Henrik

+0

Aber es ist ein guter Fang. Ich habe meinen Fehler gefunden; Vervollständigung des Betreffs in fileReader nicht. Duh! – Henrik