使用异步函数
本示例可参考示例文件"CaseStudy\WebViewer\调用Foxtable对象.Table"的窗口"使用异步函数"。
在JS中使用的Foxtable的自定义函数时,如果函数耗时比较长,最好是异步执行,因为前端JS脚本是独立的进程,如果自定义函数长时间没有反应,很可能会导致WebViewer崩溃退出。
需要注意的是,JS的await只对JS的异步函数有效,对于Foxtable的自定义函数无效。
所以在js脚本中异步执行Foxtable的自定义函数时,是没有办法获得执行结果的,必须采用回调函数将执行结果传递给前端脚本处理,或直接将执行结果发送给前端脚本处理。
参考:
发送文本消息
发送JSON消息
示例
1、新建一个自定义函数ComputeAsync,代码为:
'''Async
Dim
sum
As
Long
'一段比较耗时的代码
For
m
As
Integer
= 1
To
2000
For
i
As
Integer
= 0
To
1000000
sum = sum + i
Next
Next
'异步函数执行回调函数的代码,必须包裹在同步代码中:
BaseMainForm.Invoke(Sub()
If
Forms("使用异步函数").Opened()
Then
Dim
wv
As
WebViewer = Forms("使用异步函数").Controls("WebViewer1").WebViewer
wv.ExecuteScriptAsync("receiveComputeResult("
& sum &
")")
End
If
End
Sub)
这个函数有两部分,第一部分是想当耗时的一个计算,第二部分将计算结果通过回调函数发送给前端脚本
2、测试页面的前端JS脚本代码:
<script>
const ft = window.chrome.webview.hostObjects.sync.ft;
const computeBtn =
document.getElementById("computeBtn"); //
获取按钮元素
const originalBtnText = computeBtn.innerText; //
保存按钮原始标题
function executeComputeAsync() {
computeBtn.innerText = "正在计算,请稍后...";
resultTextBox.value = "";
computeBtn.disabled = true; //
点击后修改按钮标题并禁用(防止重复点击)
ft.Functions.ExecuteAsync("ComputeAsync" );
// 调用异步函数进行计算
}
//
回调函数,用于将计算结果显示到文本框中,并恢复按钮状态:
function receiveComputeResult(value) {
const resultTextBox = document.getElementById("resultTextBox");
resultTextBox.value = value;
computeBtn.innerText = originalBtnText; //
计算完成后恢复按钮原始标题和可用状态
computeBtn.disabled = false;
}
</script>
这里的脚本代码有两个函数,一个用于调用Foxtable的异步函数进行计算,一个是回调函数,用于获取Foxtable的计算结果,二者都有一些额外的代码用于维护按钮状态。