我正在使用Node,并试图通过访问saveToFile
方法中的end
事件来了解我的PDF何时创建。我已经提出了以下内容,但这实际上没有任何作用——没有生成PDF:-
return new Promise(function(resolve, reject) {
client.convertHtml(html, {
pdf: function(rstream) {
rstream.on('end', function() {
pdf.saveToFile(path);
resolve();
});
}
}, a4);
});
我可以在库中看到最终方法:-
var saveToFile = function(fname) {
return {
pdf: function(rstream) {
var wstream = fs.createWriteStream(fname);
rstream.pipe(wstream);
},
error: function(errMessage, statusCode) { console.log("ERROR: " + errMessage); },
end: function() {},
};
}
但我不知道如何把这一切结合在一起。我目前有一个围绕函数的bluebird Promise
,其想法是在成功结束事件时解决Promise,然后继续:-
_generatePdf(stuffs).then(function() {
console.log('all done here');
});
我想这一切都很简单——感谢帮助!
如有需要,我们将乐意为您提供更多信息。
感谢您的帮助。
您正在覆盖处理文件写入的默认函数。在新函数中,您没有从rstream
读取任何数据,这就是为什么不会发出end
事件的原因。尝试如下:
pdf: function(rstream) {
rstream.on('end', function() {
pdf.saveToFile(path);
resolve();
});
var wstream = fs.createWriteStream(path);
rstream.pipe(wstream)
},
我最终用以下代码解决了这个问题。正如hassansin暗示的那样,我没有从rstream
:-中获取数据
return new Promise(function(resolve, reject) {
var client = new pdf.Pdfcrowd(username, key);
var data = [];
client.convertHtml(html, {
pdf: function(rstream) {
rstream.on('data', function(chunk) {
data.push(chunk);
});
rstream.on('end', function() {
var buffer = new Buffer(data.reduce(function(prev, current) {
return prev.concat(Array.prototype.slice.call(current));
}, []));
fs.writeFile(fpath, buffer, 'binary', function onComplete(err){
if(err){
throw err;
}
resolve();
});
});
}
}, a4);
});
希望这能帮助其他有同样问题的人:(