NodeJS 按需或异步使用/阅读流

yftpprvb  于 2023-03-17  发布在  Node.js
关注(0)|答案(1)|浏览(111)

我想在我需要的时候从流中获取块。但是不知道如何去做而不是流。据我所知,通常的流是从输入流到输出,但是我想要的是存储流,然后在我需要的时候泄漏一些量,直到流干。
“真实的的密码"

const fs = require('fs')
let end = false

const requestChunkFrom = async (stream, size) => {
    while(1) {
        if (stream.readable){
            let data = await stream.read(size);
            if (data) return {chunk: data , isEnd: false}
        }
        if (stream.closed) return {chunk: null,  isEnd: true} 
    }
}
const job = async () => {
    let stream = fs.createReadStream('README.md')
    stream.on('end', () => {
        console.log('end')
        stream.close()
    })
    stream.on('readable', () => {
        console.log('readable')
    })
    do {
        const {chunk, isEnd} = await requestChunkFrom(stream, 16)
        end = isEnd
        console.log(chunk)
    } while (!end)
}
job()

我认为这个函数会一直等到readableclosed返回块,但它没有按预期工作。

wydwbb8l

wydwbb8l1#

首先,你的异步函数中没有任何wait,你的stream.read()返回一个Promise,所以你需要等待它。

const requestChunkFrom = async (stream, size) => {
  while(1) {
    if (stream.readable){
        let data = await stream.read(size);
        return {chunk: data , isEnd: false}
    }
    if (stream.closed) return {chunk: null,  isEnd: true} // But there might unconsumed data have left.
  }
}

尝试此操作,看看是否会得到任何结果

stream.on('readable', async() => {
        console.log('readable')
        do {
         const {chunk, isEnd} = await 
         requestChunkFrom(stream, 16)
         end = isEnd
         console.log(chunk)
        } while (!end)
})

相关问题