如何在自定义函数中处理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
相关产品推荐
相关产品推荐

