使用承诺而不是事件callback

我有以下的代码,这个所有的代码是在指定的函数myFunc ,我需要的所有function将完成(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的专家是否有意义将事件转换为承诺
  2. 还有其他很好的解决scheme,我可以使用的用例?

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

将事件转换为承诺只有当你绝对肯定“结束”事件只会触发一次时才有意义。

所以在这种情况下,是的,你正在build议的实施应该工作(假设我正确理解你的代码)。

1)是的,把这样的事件转化为一个承诺是完全合理的。 目前,不同的库有不同的expression事件的方式(事件,消息,callback函数,错误callback函数,exception,错误代码等等)。 承诺很快将统一所有这些现在他们是一个JavaScript标准。 因此,在您使用的库周围放置一个Promise图层,并在代码中只使用Promise而不是旧的混乱,这是一个很好的做法。

2)你的解决scheme对我来说很好。