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

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事件

如果上述写法仍有问题,或需要处理复杂异步逻辑,推荐通过消息传递获取结果,稳定性更高:

  1. 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);
}
  1. 通过ExecuteScriptAsync触发异步逻辑并发送结果
await webView.CoreWebView.ExecuteScriptAsync(@"
(async () => {
    const bar = await myAsyncJsFunction();
    // 将结果发送给C#端
    window.chrome.webview.postMessage(bar);
})();
");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:01:25