使用异步函数


本示例可参考示例文件"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的计算结果,二者都有一些额外的代码用于维护按钮状态。


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