2016-07-24 2 views
0

ストリームの解析にcsv-parseを使用しています。レコードごとに、私は関数mapper.process()を呼び出す必要があります。後者の関数は約束を返すので、coと接頭辞はyieldです。スローされたエラーをPromiseの外部で見えるようにするには?

parser.on('readable', function() { 
    var record; 
    while (record = parser.read()) { 
    return co(function*() { 
     yield mapper.process(record); 
    }); 
    } 
}); 

追加しないと(行4,6およびyieldを削除しないと)すべて正常に機能します。ただし、上記のパーサーを使用すると、スローされたエラーが飲み込まれます。

これを修正するにはどうすればよいですか?

答えて

2

ここでの問題は、co関数の後にキャッチハンドラがないためにスローされたエラーが消えることです。

さらに重要なことに、whileループ内のreturn文は関数全体を返します。したがって、バッファ内に複数のレコードがある場合は、それらに到達しません。あなたはそれを動作させるために、次のコードを書くことができます

parser.on('readable', function() { 
    return co(function*() { 
    var record; 

    while (record = parser.read()) { 
     const result = yield mapper.process(record); 

     // do something with the result.. 
     console.log('result is ', result); 
    } 
    }) 
    .catch((err) => console.error(err)); 
}); 

しかし、あなたは「読める」コールバックの内側非同期コードを扱っているので、ことに注意してください、あなた関数がすぐに戻るようにします。この動作により、ストリーム末尾のパーサーが "finish"イベントを呼び出すようになります。実際にはの前にと表示されます。

+0

ニース.................! –

関連する問題