2016-07-24 10 views
0

Ich verwende csv-parse für Stream-Parsing. Für jeden Datensatz muss ich eine Funktion mapper.process() aufrufen. Da die letztere Funktion eine Verheißung zurückgibt, wurde sie mit co umhüllt und yield vorangestellt.Wie man geworfene Fehler außerhalb eines Versprechens sichtbar macht?

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

Ohne den Zusatz (Entfernen von Linien 4, 6 und yield), funktioniert alles einwandfrei. Bei Verwendung des Parsers wie oben gezeigt, werden geworfene Fehler jedoch verschluckt.

Wie behebt man das?

Antwort

2

Das Problem hier ist, dass jeder geworfene Fehler verschwindet, weil es keinen catch-Handler nach der Co-Funktion gibt.

Aber was noch wichtiger ist, die Return-Anweisung in der While-Schleife wird die gesamte Funktion zurückgeben, wenn Sie also mehrere Datensätze im Puffer haben, werden Sie sie nicht erreichen.

Sie können den folgenden Code schreiben, damit es funktioniert:

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

ABER, bitte beachten Sie, dass, weil Sie mit asynchronen Code innerhalb des „lesbar“ Rückruf zu tun haben, Sie Die Funktion kehrt sofort zurück. Dieses Verhalten führt dazu, dass das Ereignis "finish" vom Parser am Ende des Streams und wahrscheinlich vor aufgerufen wird und Sie die Verarbeitung der Daten abgeschlossen haben.

+0

Schön .................! –

Verwandte Themen