【问题标题】:Using promise instead of events Call back使用 promise 而不是 events 回调
【发布时间】:2017-01-07 05:29:38
【问题描述】:

我有以下代码,所有代码都在指定函数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 方面的专家,将事件转换为承诺是否有意义?
  2. 还有其他 我可以将其用于用例的好解决方案?

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

【问题讨论】:

  • 是的,如果您希望您的调用者能够等待(单个)extract 事件,那么返回一个承诺是绝对有意义的。
  • 您应该将err 传递给reject()
  • @Bergi 我怀疑 OP 不是代码的所有者。这将是 Code Review 的一个问题。
  • 您应该使用jszip 进行检查,它会负责阅读 zip 并为您返回承诺。它也得到了维护。
  • @Bergi - 非常感谢 :) ,如果错误符合我的要求,我就像这样拒绝(错误);但如果我需要不同的文本,我使用拒绝(新错误(“新文本”)可以吗?

标签: javascript node.js promise bluebird eventemitter


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    所以在这种情况下,是的,您对实现的建议应该有效(假设我正确理解您的代码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 2021-02-06
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 2021-03-17
      • 1970-01-01
      相关资源
      最近更新 更多