去掉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的还得加。


本页地址:http://www.foxtable.com/webhelp/topics/6239.htm