Как передать ожидаемые асинхронные значения через потоки в Node.js? - PullRequest
0 голосов
/ 19 июня 2019

[Отказ от ответственности: это мой самый первый выстрел в Node (я в основном парень Clojure)]

Я анализирую и преобразовываю файл CSV с помощью node-csv . Преобразование происходит с IO по проводам, и я обернул обратный вызов конструкцией async / await.

const in_stream  = fs.createReadStream('test-data')
const out_stream = fs.createWriteStream('test-output')

const parse = csv.parse({ delimiter: "\t", quote: false })

const transform = csv.transform(async (row) => {
    await translate(row[1], { from: 'en', to: 'fr' })
        .then(res => { row[1] = res.text})
    console.log(row) // this shows that I succesfully wait for and get the values
    return row
})

const stringify = csv.stringify({
    delimiter: ';',
    quoted: true 
})

in_stream.pipe(parse).pipe(transform).pipe(stringify).pipe(out_stream)

Похоже, что поток заканчивается до того, как значения будут переданы из трансформатора.

Как вы справляетесь с задержанными значениями в потоках в Node.js? Я явно ошибаюсь ...

(Я могу предоставить фиктивный файл CSV, если это поможет)

1 Ответ

1 голос
/ 24 июня 2019

Проблема в вашей transform функции

const transform = csv.transform(async (row) => {
    await translate(row[1], { from: 'en', to: 'fr' })
        .then(res => { row[1] = res.text})
    console.log(row) // this shows that I succesfully wait for and get the values
    return row
})

То, что вы делаете здесь, предполагает, что async можно просто использовать без каких-либо последствий. Проблема в том, что вы на самом деле ничего не возвращаете из своей асинхронной функции в ожидаемом обратном вызове, то, что передается более поздним функциям, - ничто

Исправить несложно, передать данные обратно в функцию обратного вызова

const transform = csv.transform(async (row, done) => {
    await translate(row[1], { from: 'en', to: 'fr' })
        .then(res => { row[1] = res.text})
    console.log(row) // this shows that I succesfully wait for and get the values
    done(null, row)
})

См. URL ниже

https://csv.js.org/transform/options/

Результат

$ node index.js && cat test-output
[ '7228', 'Pot de café en acier inoxydable', '17.26' ]
[ '5010',
  'Set de 4 bidons avec couvercle PS (acier inoxydable)',
  '19.92' ]
[ '7229', 'Cafetière pour 6 tasses (acier inoxydable)', '19.07' ]
"7228";"Pot de café en acier inoxydable";"17.26"
"5010";"Set de 4 bidons avec couvercle PS (acier inoxydable)";"19.92"
"7229";"Cafetière pour 6 tasses (acier inoxydable)";"19.07"
...