如何 return 来自位于主函数内部的事件内部的值?

How to return a value from inside of an event that is located inside the main function?

我正在 Google 云函数中创建一个函数,它应该 return base64 pdf。我正在使用 pdfmake 库。使用 console.log() 我可以看到 base64 已正确生成,但我无法 return 调用者的值。

pdf 文档使用 .end() 关闭,并触发事件 .on('end')。问题是我似乎无法 return 事件内部的值。

当我将 return 放入事件中时(就像现在一样),firebase 等待结束并且 return 为空。

如果我将 return 放在 .end() 之后,值 returned 为 null,就好像事件是异步的并且没有任何时间处理。

exports.pdf = functions.https.onCall((data, context) => {

    var PdfPrinter = require('pdfmake');
    var printer = new PdfPrinter(fonts);

    let fonts = {...};
    var docDefinition = {...};

    var pdfDoc = printer.createPdfKitDocument(docDefinition);

    let chunks = [];
    let pdfBase64 = null;

    pdfDoc.on('data', (chunk) => {
        chunks.push(chunk);
    });        

    pdfDoc.on('end', () => {
        const result = Buffer.concat(chunks);
        pdfBase64 = 'data:application/pdf;base64,' + result.toString('base64');
        console.log(pdfBase64);
        return {pdfBase64: pdfBase64};
    });


    pdfDoc.end();



});

我怎么能return值?

您需要 return 一个最终解析为发送给客户端的数据的承诺。尝试这样的事情:

// everything above stays the same

const p = new Promise((resolve, reject) => {
    pdfDoc.on('end', () => {
        const result = Buffer.concat(chunks);
        pdfBase64 = 'data:application/pdf;base64,' + result.toString('base64');
        console.log(pdfBase64);
        resolve({pdfBase64: pdfBase64});
    });
})

pdfDoc.end();

return p;