【问题标题】:Node Unzipper - how to know it's finishedNode Unzipper - 如何知道它已经完成
【发布时间】:2020-01-29 05:01:14
【问题描述】:

我正在尝试使用 unzipper 节点模块来提取和处理一些文件(具体数量未知)。但是,我似乎无法弄清楚如何知道所有文件何时被处理。到目前为止,我的代码如下所示:

s3.getObject(params).createReadStream()
.pipe(unzipper.Parse())
.on('entry', async (entry) => {
    var fileName = entry.path;
    if (fileName.match(someRegex)) {
        await processEntry(entry);
        console.log("Uploaded");
    } else {
        entry.autodrain();
        console.log("Drained");
    }
});

我正在试图弄清楚如何知道解压缩器已经遍历了所有文件(即,没有更多的 entry 事件即将发生)并且所有 entry 处理程序都已完成,所以我知道我已经完成了我关心的所有文件的处理。

我尝试过使用 closefinish 事件进行试验,但是当我尝试时,它们都会在 console.log("Uploaded"); 打印之前触发,所以这似乎不对。

帮助?

【问题讨论】:

    标签: node.js unzip synchronous


    【解决方案1】:

    直接from the docs:

    解析器像任何其他流一样发出finisherror 事件。解析器还为这两个事件提供了一个 Promise 包装器,以便轻松折叠到现有的基于 Promise 的结构中。

    例子:

    fs.createReadStream('path/to/archive.zip')
      .pipe(unzipper.Parse())
      .on('entry', entry => entry.autodrain())
      .promise()
      .then( () => console.log('done'), e => console.log('error',e));
    

    【讨论】:

    • 我试过了。与上面的示例一起使用,finish 事件在console.log("Uploaded"); 打印之前触发。如果我尝试使用.promise().then() 模式,也会发生同样的事情。我的示例很可能还有其他问题——如果经过调整——finish 方法会起作用,但我不知道有什么问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多