无法在Node.js中与Stimulsoft Reports“等待”异步功能

问题描述 投票:0回答:3

我需要能够调用一些JS,并等到stimulsoft报告完成。

我想可能他们可能有自己的异步“味道”。

原始代码看起来像这样

report.renderAsync(() => {
    console.log("Report rendered. Pages count: ", report.renderedPages.count);

    // Export to PDF
    report.exportDocumentAsync((pdfData: any) => {
        // Converting Array into buffer
        var buffer = Buffer.from(pdfData)

        // File System module
        var fs = require('fs');

        // Saving string with rendered report in PDF into a file
        fs.writeFileSync('./Invoice.pdf', buffer);
        console.log("Rendered report saved into PDF-file.");
    }, Stimulsoft.Report.StiExportFormat.Pdf);
});

我尝试了类似于以下代码的各种组合,但是我无法使其正确地“等待”-其他所有内容都将运行,然后该代码最后运行,

const result = await report.renderAsync(async() => {
    console.log("Report rendered. Pages count: ", report.renderedPages.count); // << this outputs after all code! 
    // Export to PDF
    await report.exportDocumentAsync(async (pdfData: any) => {
        // Converting Array into buffer
        var buffer = Buffer.from(pdfData)

        // File System module
        //var fs = await require('fs');

        // Saving string with rendered report in PDF into a file
        //await fs.writeFileSync('./Invoice.pdf', buffer);
        console.log("Rendered report saved into PDF-file.");
        return buffer
    }, Stimulsoft.Report.StiExportFormat.Pdf);
});
    return result
node.js stimulsoft
3个回答
0
投票

尝试创建一个Promise并包装到异步函数中。

report.renderAsync(async() => {
  console.log("Report rendered. Pages count: ", report.renderedPages.count);

  // Export to PDF
  await new Promise((resolve) => {
    report.exportDocumentAsync((pdfData: any) => {
      // Converting Array into buffer
      var buffer = Buffer.from(pdfData)

      // File System module
      var fs = require('fs');

      // Saving string with rendered report in PDF into a file
      fs.writeFileSync('./Invoice.pdf', buffer);
      console.log("Rendered report saved into PDF-file.");
      resolve();
    }, Stimulsoft.Report.StiExportFormat.Pdf);
  })
});

0
投票

这是一个标准的回调,它只是用Async命名。

这是您要寻找的机器:

const getReport = () => new Promise(resolve => 
 report.renderAsync(() => {
    console.log("Report rendered. Pages count: ", report.renderedPages.count);

    // Export to PDF
    report.exportDocumentAsync((pdfData: any) => {
        // Converting Array into buffer
        var buffer = Buffer.from(pdfData)

        // File System module
        var fs = require('fs');

        // Saving string with rendered report in PDF into a file
        fs.writeFileSync('./Invoice.pdf', buffer);
        console.log("Rendered report saved into PDF-file.");
        resolve(report.renderedPages)
    }, Stimulsoft.Report.StiExportFormat.Pdf);
});

然后像这样使用它:

getReport().then(pages => console.log(pages.count))

或:

async function doSomethingWithReport() {
  const renderedPages = await getReport()
  // do something with them
}

doSomethingWithReport()

您需要的Google搜索是“我如何承诺回调”。


0
投票

我可以双重承诺使用

await new Promise(render => {
            report.renderAsync(async () => {
                console.log("Report rendered. Pages count: ", report.renderedPages.count);
                // Export to PDF
                await new Promise(resolve => {
                    report.exportDocumentAsync((pdfData: any) => {
                        // Converting Array into buffer
                        const buffer = Buffer.from(pdfData);
                        // File System module
                        const fs = require("fs");
                        // Saving string with rendered report in PDF into a file
                        fs.writeFileSync(generatedFileName, buffer);
                        console.log("Rendered report saved into PDF-file.");
                        resolve(report.renderedPages);
                    }, Stimulsoft.Report.StiExportFormat.Pdf);
                });
                render();
            });
        });
const data = readFileSync(generatedFileName);
© www.soinside.com 2019 - 2024. All rights reserved.