return 如何在 node.js 中使用事件发射器
How return event emitter in node.js
我有这段代码
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
内调用,所以我需要 return 一个新的文件数组,但在 return 之前,我需要调用回调,每个都会其他事情自己负责。
问题是:我怎样才能return pdf.on('close', funct....)
??
在里面,我有 return callback(file);
每个 return 正是我想要的,但现在我需要 return 来自 pdf.on....
[=17 的相同东西=]
谢谢。
您的函数是异步的,应该 return 一个承诺。废弃那个回调。
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
});
}
我有这段代码
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
内调用,所以我需要 return 一个新的文件数组,但在 return 之前,我需要调用回调,每个都会其他事情自己负责。
问题是:我怎样才能return pdf.on('close', funct....)
??
在里面,我有 return callback(file);
每个 return 正是我想要的,但现在我需要 return 来自 pdf.on....
[=17 的相同东西=]
谢谢。
您的函数是异步的,应该 return 一个承诺。废弃那个回调。
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
});
}