Estoy tratando de leer un archivo csv en Typescript con la biblioteca "csv-parse" creando un observable; el siguiente código usa fs.createReadStream para leer el archivo; Me gustaría devolver el observable y suscribirme a él, pero el proceso no obtiene nada, probablemente porque no estoy esperando el fs.createReadStream asíncrono; como resolver?
import { parse } from "csv-parse"; import { Observable } from "rxjs"; import * as fs from "fs"; import path from "path"; export interface StdJsonDoc<T = string> { [key: string]: T; } export function createCsvObservable( filePath: string, fileType: string | undefined = undefined, fieldDelimiter: string = ",", columnHeader: boolean = true ) { if (fileType !== "csv") { throw Error(`Cannot create CSV observable from non CSV file`); } return new Observable<StdJsonDoc>((subscriber) => { const parser = fs.createReadStream(filePath).pipe( parse({ delimiter: fieldDelimiter, columns: columnHeader, trim: true, skip_empty_lines: true, relax_column_count: true, }) ); parser.on("readable", () => { let record: StdJsonDoc; while ((record = parser.read())) { subscriber.next(record); } }); parser.on("end", () => { subscriber.complete(); }); parser.on("error", () => { subscriber.error(); }); }); } async function main() { const myObservableCsv = createCsvObservable( path.join(__dirname, "data", "myCsvFile.csv"), "csv" ); myObservableCsv.subscribe({ next: (record) => { console.log(`RECORD: ${record}`); }, error: () => { console.log("ERROR"); }, complete: () => { console.log("COMPLETE"); }, }); } main().then(() => { console.log(`*** END PROGRAM ***`); process.exit(0); });La persona que llama no se suscribe al observable devuelto. Qué pasa cuando haces:
createCsvObservable(path.join(__dirname, "data", "myCsvFile.csv"),"csv").subscribe(console.log);El problema era el principal "asincrónico"; eliminó "async" y simplemente llamó a main () funciona.