6

なぜフラットマップがダウンストリームの減少を引き起こさないのですか?RxJSの減少が継続しない

私のようなコードを持って:

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

そして、問題はタップがヒットされることはありません「の後に減らす」ということです。どうして?

ログは次のようである:

​​

スクリーンショット:

Error screenshot

答えて

2

ファイルが配列の場合、fileReaderから返されたオブザーバブルの場合はreduceを終了する必要があります。だから、このコードでは、問題はfileReaderが完了しなかったobservableを返すことでした。

10

問題はflatMapではありません。それは方法であるreduceが働いている。

reduceは、ストリーム全体を読み込み、単一の値に減らします。これは、ソースストリームが閉じられている場合にのみ発生します。 from(files)ストリームが終了しない場合、reduceは決してその値を出力しません。

scanを代わりに使用してください。それはそれぞれの中間ステップを放出し、あなたが探しているものと思われます。

+0

ファイルは、平易でシンプルなJS配列です。スクリーンショットを追加しました。前にスキャンしていたのですが、それはうまくいきました...しかし、JS配列の集約はonCompleteを行うべきなのでしょうか? – Henrik

+0

しかし、それは良いキャッチです。私は間違いを見つけた。 fileReaderで件名を記入していない。ダー! – Henrik

関連する問題