去掉await
WebViewer中js脚本是运行在独立线程中的,为了不阻塞前端页面的更新,对于Foxtable的调用默认用的是异步方式,所以很多地方要加上await。
本人踩await的坑多次,因为漏加await、误加await或加的位置不对,都会出问题。
那有没有办法默认同步执行,不要加await呢?可以的,而且实现起来非常简单,只需将:
const ft =
window.chrome.webview.hostObjects.foxlib; //引用Foxtable库
改为:
const ft = window.chrome.webview.hostObjects.sync.foxlib; //引用FoxLib库
那么前端对Foxtable的调用就会全部改为同步方式,不再需要await了。
以上一节的增加行为例,改为同步方式之后的代码如下,所有await都去掉了,当然也就不用担心踩坑了:
'''Async
Dim
wv
As
WebViewer = e.Form.Controls("WebViewer1").WebViewer
Await
wv.EnsureCoreWebView2Async(Nothing)
'初始化浏览器
Dim
ft
As
New
FoxLib(wv)
'创建Foxtable库
wv.CoreWebView2.AddHostObjectToScript("ft",
ft) '注入Foxtable库
' 定义测试页面
Dim
html
As
String
=
<![CDATA[
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>button{padding:10px 30px;font-size:16px;margin:20px;}</style>
</head>
<body>
<button onclick="addOrderRow()">增加行</button>
<script>
const ft = window.chrome.webview.hostObjects.sync.ft
//引用Foxtable库
function addOrderRow() {
const Orders = ft.Tables["订单"];
let dr = Orders.AddNew();
dr["产品"]
= "PD01";
dr["客户"]
= "CS03";
dr["雇员"]
= "EP02";
dr["单价"]
= 20;
dr["折扣"]
= 0.05;
dr["数量"]
= 180;
dr["日期"]
= new Date();
alert(dr["客户"]
+ "增加了新订单");
//显示新增订单的客户名称
}
</script>
</body>
</html>
]]>.Value
wv.NavigateToString(html)
'打开测试页面
提醒:
1、从现在开始,接下来的代码都将大都采用同步方式。
2、只是js中调用Foxtable的位置不要await了,其他地方该加await的还得加。