Невозможно выполнить «Ожидание» асинхронной функции со Stimulsoft Reports в Node.js - PullRequest
0 голосов
/ 29 февраля 2020

Мне нужно позвонить на номер JS и подождать, пока он не закончится с отчетами о стимулсофт.

Я думаю, возможно, у них может быть свой собственный "вкус" asyn c.

Оригинальный код выглядит так

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

Ответы [ 3 ]

0 голосов
/ 29 февраля 2020

Это стандартный обратный вызов, он просто называется Asyn c.

Это машина, которую вы ищете:

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 голосов
/ 06 марта 2020

Я смогу использовать с двойным обещанием

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);
0 голосов
/ 29 февраля 2020

Попробуйте создать обещание и обернуть в асин c функцию.

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);
  })
});
...