Javascript 如何在node.js中返回事件发射器
我有这段代码Javascript 如何在node.js中返回事件发射器,javascript,node.js,pdf,promise,eventemitter,Javascript,Node.js,Pdf,Promise,Eventemitter,我有这段代码 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'
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
中调用的,因此我需要返回一个新的文件数组,但在返回之前,我需要调用回调函数,每个回调函数将负责其他事情
问题是:如何返回('close',funct…)
在它里面,我有返回回调(文件)代码>每个都返回了我想要的内容,但现在我需要从pdf.on….
谢谢。您的函数是异步的,应该返回一个承诺。取消那个回叫
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
});
}
那么,实际上您想要返回pdf文本的承诺吗?您对结果做了什么?为什么不将页面
视为一个数组?文件是什么样子的?我在Promise.map中调用这个函数,并发度为3000。因此,当程序完成时,我想调用堆栈中的下一个promise,它负责清理文本。。问题是,我不能返回EventEmitter@BergiYes,你不应该返回事件发射器!你需要从promise.map
callbacks返回一个promise。这是我正在做的函数阶段_one将收到一个包含如下对象的数组:{name:'name_of_file.pdf'},所以我想获取其中的文本,为了实现这一点,我创建了pdf函数,它将一次接收一个pdf,并将使用pdftotext提取文本。您的代码也会发生同样的情况。函数第二阶段(文件)上的文件将是未定义的,因为我不会返回任何承诺。map@JoãoCalvin:那么你在我的代码中遗漏了4个return
语句中的一个,问题是在代码的其他部分,我只是注意到我在主链中没有返回任何内容。谢谢你,伯吉!