在节点中的 PDFCrowd 的 saveToFile 方法中访问结束事件
Accessing end event in PDFCrowd's saveToFile Method in Node
我正在使用 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);
});
希望这能帮助遇到同样问题的其他人:)
我正在使用 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);
});
希望这能帮助遇到同样问题的其他人:)