6

Perché il flatMap non causa il rischio di riduzioni a valle?Riduzione RxJS non continua

ho ottenuto il codice come:

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')); 

E il problema è che il rubinetto 'dopo ridurre' non viene mai colpito. Perché?

Il registro è simile:

reduce step [data] 
reduce step [data] 

Screenshot:

Error screenshot

risposta

2

Se i file sono un array, ridurre dovrebbe terminare se l'osservabile restituito da fileReader lo fa. Quindi per questo codice, il problema era che fileReader restituiva un osservabile che non era completo.

10

Il problema non è in flatMap; è nel modo in cui funziona reduce.

reduce legge in un intero flusso e lo riduce a un valore singolo, emesso solo quando il flusso di origine viene chiuso. Se lo stream from(files) non termina, quindi reduce non verrà mai emesso il suo valore.

Provare a utilizzare scan; emette ogni passaggio intermedio e sembra essere quello che stai cercando.

+0

I file sono un array JS, semplice e semplice. Ho aggiunto uno screenshot. Avevo la scansione prima e questo ha funzionato ... Ma dal momento che è un aggregatore di array JS dovrebbe fare onComplete, giusto? – Henrik

+0

Tuttavia, è una buona presa. Ho trovato il mio errore; non completare l'argomento in fileReader. Duh! – Henrik