在节点中的 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);
    });

希望这能帮助遇到同样问题的其他人:)