javascript - 使用 Promise 代替事件回调

标签 javascript node.js promise bluebird eventemitter

我有以下代码,所有代码都是在指定函数myFunc中实现的,我需要所有函数都完成(myFunc),即当文件提取成功/或未返回某些状态(成功/错误)。

var myFunc = () => {

var DecompressZip = require('decompress-zip');
var unzipper = new DecompressZip(filename)

unzipper.on('error', function (err) {
    console.log('Caught an error');
});

unzipper.on('extract', function (log) {
    console.log('Finished extracting');
});

unzipper.on('progress', function (fileIndex, fileCount) {
    console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount);
});

unzipper.extract({
    path: 'some/path',
    filter: function (file) {
        return file.type !== "SymbolicLink";
    }
});

};

由于这个开源正在处理事件,这是一个问题(为了获得返回状态......)我的意图是将其更改为通过 promisify 或 就像下面这样:

   var myFunc = () => {
    
   return new Promise(function(resolve, reject) {
    var DecompressZip = require('decompress-zip');
    var unzipper = new DecompressZip(filename)
    
    unzipper.on('error', function (err) {
        console.log('Caught an error');
        reject();
    });
    
    unzipper.on('extract', function (log) {
        console.log('Finished extracting');
        resolve();
    });
    
    unzipper.on('progress', function (fileIndex, fileCount) {
        console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount);
    });
    
    unzipper.extract({
        path: 'some/path',
        filter: function (file) {
            return file.type !== "SymbolicLink";
        }
    });
    
    };

我的问题是:

  1. 由于我不太擅长 JS,将事件转换为 Promise 是否有意义?
  2. 还有其他的 我可以将其用于用例的好解决方案吗?

这是OP https://github.com/bower/decompress-zip

最佳答案

1) 是的,将此类事件转换为 Promise 是非常有意义的。目前,不同的库有不同的表达事件的方式(事件、消息、回调函数,然后是错误回调函数、异常、错误代码等)。 Promise 很快就会统一这一切,现在它们已成为 Javascript 标准。因此,最好的做法是在您正在使用的库周围放置一个 Promise 层,并在代码中仅使用 Promise,而不是使用旧的困惑。

2)你的解决方案对我来说看起来不错。

关于javascript - 使用 Promise 代替事件回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39235798/

相关文章:

node.js - Mongoose:分配类型为 'array of Strings' 的字段

javascript - Angular 5等待 promise 从for循环返回

javascript - 从服务器生成客户端 JavaScript 时主要关注什么?

javascript - 限制允许选中的复选框数量

javascript - Gulp cwd 到项目根目录

node.js - 如何删除NodeJs目录中的所有txt文件

node.js - AWS Lambda 可以访问 S/FTP 或与之交互吗?

javascript - 何时使用promise.all()?

reactjs - 当 Apollo 获取的数据通过 React 和 GraphQL 准备就绪时

javascript - 如何只打印首页