【问题标题】:How return event emitter in node.js如何在 node.js 中返回事件发射器
【发布时间】:2015-11-03 15:43:32
【问题描述】:

我有这段代码

module.exports = function(file, callback) {
  var output, pdf, result, stderr;
  output = '';
  stderr = '';
  result = [];
  pdf = child_process.spawn('pdftotext', ['-layout', '-enc', 'UTF-8', file.name, '-']);
  pdf.stdout.setEncoding('utf8');
  pdf.stderr.setEncoding('utf8');
  pdf.stdout.on('data', function(data) {
    if (data) {
      output += data;
    }
  });
  pdf.stderr.on('data', function(data) {
    if (data) {
      stderr += data;
    }
  });
  return pdf.on('close', function(code) {
    var last_page, pages;
    if (code !== 0) {
      return stderr;
    } else {
      pages = output.split(/\f/);
      if (!pages) {
        return 'Nenhum texto foi encontrado';
      }
      last_page = pages[pages.length - 1];
      if (!last_page) {
        pages.pop();
      }
      file.text += pages;
      return callback(file);
    }
  });
};

基本上,我使用 pdftotext bash 程序获取 PDF 的文本。

这个函数在Promise.map内部被调用,所以我需要返回一个新的文件数组,但是在返回之前,我需要调用回调,每个人都会负责其他的事情。

问题是:我怎样才能返回pdf.on('close', funct....) ??

在里面,我有 return callback(file); 每个都返回我想要的,但现在我需要从 pdf.on.... 返回相同的东西

谢谢。

【问题讨论】:

  • 那么实际上你想为 pdf 的文本返回一个承诺?
  • 你在用result做什么?为什么不将pages 视为一个数组? file 长什么样子?
  • 我在一个并发 3000 的 Promise.map 中调用这个函数。所以当程序完成时,我想调用堆栈中的下一个承诺,它负责清理文本..问题是,我无法返回 EventEmitter @Bergi
  • 是的,您不应该返回事件发射器!您需要从Promise.map 回调返回一个承诺。
  • 这就是我正在做的codepen.io/anon/pen/bVjjeV?editors=001 函数 phase_one 将收到一个包含这样的对象的数组:{ name: 'name_of_file.pdf' },所以我想把里面的文本,因为实现这一点,我创建了 pdf 函数,它将一次接收一个 pdf 并使用 pdftotext 提取文本。

标签: javascript node.js pdf promise eventemitter


【解决方案1】:

您的函数是异步的,应该返回一个承诺。取消该回调。

module.exports = function(filename) {
  var output = '';
  var stderr = '';
  var pdf = child_process.spawn('pdftotext', ['-layout', '-enc', 'UTF-8', filename, '-']);
  pdf.stdout.setEncoding('utf8');
  pdf.stderr.setEncoding('utf8');
  pdf.stdout.on('data', function(data) {
    if (data) output += data;
  });
  pdf.stderr.on('data', function(data) {
    if (data) stderr += data;
  });
  return new Promise(function(resolve, reject) {
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    pdf.on('close', function(code) {
      if (code)
        reject(new Error(stderr, code)); // call reject() for errors…
      else
        resolve(output); // and resolve() with the result *instead of that `callback`*
    });
  }).then(function(result) { // so that you then can chain processing to
    var pages = result.split(/\f/);
    if (!pages.length) {
      throw new Error('Nenhum texto foi encontrado');
    }
    var last_page = pages[pages.length - 1];
    if (!last_page)
      pages.pop();
    return pages.join("");
  });
};

这样,您可以轻松地将其用作正确的Promise.map 回调:

function phase_one(files) {
  return Promise.map(files, function(file) {
    return pdf(file.name).then(function(text) {
      file.text = text;
      return file;
    });
  }, {
    concurrency: 3000
  });
}

【讨论】:

  • 您的代码也是如此。函数 phase_two(files) 上的文件将未定义,因为我没有向 Promise.map 返回任何内容
  • @JoãoCalvin:那么您在我的代码中缺少 4 个 return 语句之一
  • 嗯,问题出在代码的其他部分,我只是注意到我在主链中没有返回任何内容。谢谢你,Bergi!
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多