如何通过Node.js中的流传递等待的异步值?

时间:2019-06-19 17:33:29

标签: javascript node.js async-await stream

[免责声明:这是我在Node上的第一枪(我主要是Clojure家伙)]

我正在使用node-csv解析和转换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 个答案:

答案 0 :(得分:1)

问题是您的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)
})

请参阅下面的网址

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"