You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义函数中处理Promise?Power BI Embedded.NET应用问题

Power BI Embedded 自定义函数Promise pending问题排查与解决

可能的核心原因

  • 自定义函数里没正确调用resolve/reject来结束Promise,导致它一直处于挂起状态
  • 调用自定义函数时没处理异步结果,比如没加await或.then()
  • 报表还没完全加载就调用函数,异步操作根本没触发

具体修复步骤

1. 给自定义函数补全Promise的状态处理

先确保你的函数正确封装Promise,把Power BI的异步操作结果正确传递出来:

function getReportPages(report) {
  return new Promise((resolve, reject) => {
    // 调用Power BI的getPages接口
    report.getPages()
      .then(pages => {
        resolve(pages); // 拿到结果后必须resolve,结束pending状态
      })
      .catch(error => {
        reject(error); // 出错时也要reject,避免Promise卡死
      });
  });
}

2. 调用函数时正确处理异步逻辑

如果是在异步函数里调用,用await等待结果:

async function printReportPages() {
  try {
    const report = powerbi.get(reportContainer);
    // 用await等待Promise结束,拿到Pages数组
    const pages = await getReportPages(report);
    console.log(pages);
    // 这里写你的打印逻辑
  } catch (err) {
    console.error('拿报表页面失败:', err);
  }
}

如果不用async/await,就用.then()链式处理:

const report = powerbi.get(reportContainer);
getReportPages(report)
  .then(pages => {
    console.log(pages);
    // 执行打印
  })
  .catch(err => {
    console.error('出错了:', err);
  });

3. 等报表加载完成再调用函数

参考你能正常工作的事件处理器逻辑,必须等报表loaded事件触发后再执行自定义函数,避免在报表未就绪时调用API:

const report = powerbi.get(reportContainer);
report.on('loaded', async () => {
  // 报表加载完成后再调用函数
  const pages = await getReportPages(report);
  // 执行打印操作
});

4. 对比事件处理器的正确逻辑

你用事件处理器能拿到结果,本质是Power BI在事件触发时已经确保报表就绪,并且内部正确处理了getPages的Promise。你的自定义函数只要复刻这个“先等报表就绪,再正确处理异步结果”的逻辑就能解决问题。

内容的提问来源于stack exchange,提问作者Madhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:55:20