WebView2中使用ExecuteScriptAsync调用异步函数无法获取返回值问题
WebView2 ExecuteScriptAsync 获取异步函数返回值问题解决办法
问题原因
你遇到的返回null或空对象问题,核心是WebView2对异步JavaScript代码的返回值处理有特定要求:ExecuteScriptAsync会等待Promise完成,但如果代码写法不符合其解析逻辑,会导致返回值被错误序列化(比如转为null)。
直接解决写法
写法1:直接await目标异步函数
如果你的异步函数myAsyncJsFunction本身返回Promise,可直接简化代码:
var bar = await webView.CoreWebView.ExecuteScriptAsync("await myAsyncJsFunction();");
写法2:正确包裹自执行异步函数
若需要额外逻辑处理,确保自执行异步函数的Promise结果被正确返回,避免顶层await的兼容性问题:
var bar = await webView.CoreWebView.ExecuteScriptAsync("(async () => { return await myAsyncJsFunction(); })();");
测试固定返回值的话,这样写就能得到正确的"true":
var bar = await webView.CoreWebView.ExecuteScriptAsync("(async () => { return true; })();");
更可靠的替代方案:使用WebMessageReceived事件
如果上述写法仍有问题,或需要处理复杂异步逻辑,推荐通过消息传递获取结果,稳定性更高:
- C#端注册消息接收事件
// 初始化时注册事件 webView.CoreWebView.WebMessageReceived += CoreWebView_WebMessageReceived; // 处理消息的回调方法 private void CoreWebView_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) { // 获取异步返回的JSON格式结果 string resultJson = e.WebMessageAsJson; // 后续可反序列化为目标对象,比如: // var bar = JsonSerializer.Deserialize<bool>(resultJson); }
- 通过ExecuteScriptAsync触发异步逻辑并发送结果
await webView.CoreWebView.ExecuteScriptAsync(@" (async () => { const bar = await myAsyncJsFunction(); // 将结果发送给C#端 window.chrome.webview.postMessage(bar); })(); ");
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

