Blazor JSRuntime使用Blob时iframe的Promise无返回问题
Blazor中调用生成Blob的JS函数Promise不返回的排查与解决
检查JS函数的Promise处理逻辑
InvokeVoidAsync会等待JS返回的Promise完成,若BlazorDownloadFile未正确resolve Promise,就会导致Blazor端一直挂起。
正确的JS函数写法需确保Promise被resolve:window.BlazorDownloadFile = async (content, fileName, mimeType) => { const blob = new Blob([content], { type: mimeType }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = fileName; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); // 显式resolve Promise,确保Blazor端收到完成信号 return Promise.resolve(); };要是你的JS函数是同步写法,必须手动返回一个已resolve的Promise,或者用
async标记函数(async函数默认返回Promise)。排查Blob生成与后续操作是否异常
若content数据量过大、格式错误,生成Blob的过程可能卡住;或者DOM操作(如创建a标签)出现隐性错误,都会导致Promise无法完成。可以在JS函数的关键步骤添加console.log,确认每一步是否执行到最后(比如URL.revokeObjectURL之后)。验证Blazor调用的参数正确性
确认传递给JS函数的参数格式匹配:比如C#的字节数组会自动转为JS的Uint8Array,但特殊编码的字符串可能需要提前处理编码格式,避免生成Blob时出错。尝试替换调用方法测试
偶尔InvokeVoidAsync对Promise的处理存在隐性问题,可以换成await JsRuntime.InvokeAsync<object>("BlazorDownloadFile", content, fileName, mimeType);调用,看是否能正常返回。
内容的提问来源于stack exchange,提问作者ADG
相关产品推荐
相关产品推荐

