私はhighland.js
のプログラムを書いて、いくつかのファイルをダウンロードし、解凍してオブジェクトに分解し、オブジェクトストリームをflatMap
で1つのストリームにマージして出力しました。1つのストリームにエラーが発生した場合、flatMapに出力がないのはなぜですか?
function download(url) {
return _(request(url))
.through(zlib.createGunzip())
.errors((err) => console.log('Error in gunzip', err))
.through(toObjParser)
.errors((err) => console.log('Error in OsmToObj', err));
}
const urlList = ['url_1', 'url_2', 'url_3'];
_(urlList)
.flatMap(download)
.each(console.log);
すべてのURLが有効な場合、正常に動作します。 URLが無効な場合、ダウンロードされたファイルがない場合、gunzipはエラーを報告します。私は、エラーが発生したときにストリームが閉じられると思う。私はflatMap
が他のストリームを続けることを期待しますが、プログラムは他のファイルをダウンロードせず、何も印刷されません。
ストリームでエラーを処理する正しい方法と、1つのストリームにエラーが発生した後にflatMap
を停止させない方法はありますか?
命令型プログラミングでは、エラーが発生した場所をトレースするデバッグログを追加できます。ストリーミングコードをデバッグするには?
PS。 toObjParser
はノード変換ストリームです。これは、OSM XMLの読み取り可能なストリームを取得し、オーバーパスOSM JSONと互換性のあるオブジェクトのストリームを出力します。 https://www.npmjs.com/package/osm2obj
2017年12月19日更新を参照してください:
私は@amsrossが提案されているようerrors
にpush
を呼び出そうとしました。 push
が実際に動作するかどうかを検証するために、私はXML文書をプッシュし、それは次のパーサによって解析され、出力から見ました。ただし、ストリームはまだ停止しており、url_3はダウンロードされませんでした。
function download(url) {
console.log('download', url);
return _(request(url))
.through(zlib.createGunzip())
.errors((err, push) => {
console.log('Error in gunzip', err);
push(null, Buffer.from(`<?xml version='1.0' encoding='UTF-8'?>
<osmChange version="0.6">
<delete>
<node id="1" version="2" timestamp="2008-10-15T10:06:55Z" uid="5553" user="foo" changeset="1" lat="30.2719406" lon="120.1663723"/>
</delete>
</osmChange>`));
})
.through(new OsmToObj())
.errors((err) => console.log('Error in OsmToObj', err));
}
const urlList = ['url_1_correct', 'url_2_wrong', 'url_3_correct'];
_(urlList)
.flatMap(download)
.each(console.log);
'toObjParser'はノード変換ストリームです。これは、OSM XMLの読み取り可能なストリームを取得し、オブジェクトのストリームを出力します。 https://www.npmjs.com/package/osm2obj – aleung
Oooooooooh!私はその質問を誤解した。ストリームで前進するためにできることを反映するために私の答えを更新します。 – amsross
私はプッシュしようとしましたが、それでも動作しませんでした。問題の私の更新を見てください。 – aleung