首页 > 解决方案 > 如何使用 puppeteer 挂钩到 powerbi 报告加载事件

问题描述

我很高兴地使用 pupeteer/chromium 嵌入了一个 power bi 报告,然后将其保存为屏幕截图/pdf。但是,最新的要求要求我能够挂钩报告的加载事件。

我有以下代码片段,这是我用来连接事件的模板;报告正在嵌入,但“report.on”事件没有触发,(实际上我正在尝试设置一些视觉效果和其他内容,而不仅仅是日志文本。)

       await page.evaluate((configdata) => {
             const models = window['powerbi-client'].models;
             const config = {
                         ...
             };

             const report = powerbi.embed(reportContainer, config)

             report.on('loaded', function () {
                 console.log('loaded report')
             });

       },
       configdata);

我查看了“exposeFunction()”,但无法将其与此事件(或其他事件)挂钩。

有人可以告诉我我缺少什么吗?必须有办法做到这一点,但我错过了如何绑定报告对象(从 IFrame 中实例化,到使用 puppeteer 函数的事件。但是,JS/Node 不是我的主要学科,地狱它甚至不是我的第二个!

PS:我知道(并且已经开始工作)将过滤器传递给配置;但从美学的角度来看,这还不够好(屏幕上的视觉效果没有设置!)

任何帮助/指针 - 非常感谢

标签: powerbipuppeteer

解决方案


要回答这个问题,您可以使用 page.evaluate 并创建一个 Promise,该 Promise 将在触发嵌入加载事件时解决。然后你可以等待你的 loadEmbed 函数:

async function loadEmbed(page, config) {
return page.evaluate(async (config) => {
    await new Promise((resolve, reject) => {
        try {
            var embedContainer = $('#embedContainer')[0];

            var embed = powerbi.embed(embedContainer, config);

            embed.off("loaded");
            embed.on("loaded", function () {
                resolve(true);
            });
        } catch (err) {
            resolve(false);
        }
    });
}, config);

}


推荐阅读