6

Dlaczego FlatMap nie wywołuje redukcji w dół strumienia?Ograniczenie RxJS nie jest kontynuowane

mam kod jak:

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

A problem jest to, że z kranu „po zredukować” nigdy nie jest trafiony. Czemu?

Rejestr jest jak:

reduce step [data] 
reduce step [data] 

Zrzut ekranu:

Error screenshot

Odpowiedz

2

Jeśli pliki są tablicami, wówczas powinno się zakończyć zmniejszanie, jeśli obserwowalny zwróciło z fileReader. Tak więc dla tego kodu problem polegał na tym, że fileReader zwrócił obserwowalne, które nie zostało ukończone.

10

Problem nie jest w flatMap; to działa w taki sposób, że działa reduce.

reduce czyta w całym strumieniu i redukuje go do pojedynczej wartości, emitowanej tylko wtedy, gdy strumień źródłowy jest zamknięty. Jeśli Twój strumień from(files) się nie zakończy, to reduce nigdy nie wypisze swojej wartości.

Zamiast tego spróbuj użyć scan; emituje każdy krok pośredni i wydaje się być tym, czego szukasz.

+0

Pliki to tablica JS, prosta i prosta. Dodałem zrzut ekranu. Miałem skanowanie wcześniej i to działało ... Ale ponieważ jest to agregacja tablic JS, powinna wykonać onComplete, prawda? – Henrik

+0

Jest to jednak dobry chwyt. Znalazłem swój błąd; nie kończenie tematu w fileReader. Duh! – Henrik