aardio 文档
aardio 范例: web.view 回调 JS 函数对象
调用 JS 函数
import win.ui;
/*DSG{{*/
var winform = win.form(text="web.view 回调 JS 函数对象";right=757;bottom=467)
winform.add()
/*}}*/
import web.view;
var wb = web.view(winform);
/*
第一原则:在 JS 与 aardio 代码交互时应避免同步发起反向调用。
违反此原则可能导致 WebView2 调用异常、卡顿等问题。
- 在 aardio 中调用 JS 总是异步发起调用,
但 调用 wb.eval, wb.xcall 时默认会阻塞等待 JS 返回值,
除非在指定了接收 JS 返回值的回调函数(异步调用,不会阻塞调用代码)。
在被网页回调的 aardio 函数内部应避免阻塞调用导致阻塞后续调用。
如果不需要返回值,改用 wb.invoke, wb.doScript 更轻量且不需要处理返回值与回调。
或者通过 winform.setTimeout, thread.invoke 也可以异步执行代码。
- 在 JS 中虽然 aardio 函数的返回值是异步对象,但这不等于发起调用的过程是异步的。
一个正被 aardio 回调的 JS 函数内如果要反向回调 aardio,则应通过 setTimeout 异步发起调用。
*/
wb.external = {
test = function(jsCallback){
/*
使用 wb.external 与 JavaScript 交互则是基于 COM 接口。
除了字符串、数值、布尔值、时间值、buffer 这些基于传值的类型可以兼容以外,
其他需要传址的 JS 对象(例如 JS 函数)在 aardio 中则是 COM 对象。
COM 对象可以保持对原 JS 对象的引用,作为参数传回 JS 仍然会是原来的 JS 对象。
jsCallback 参数是一个 JS 函数对象,在 aardio 中可以直接使用。
但 aardio 中的 JS 函数对象基于 COM 接口,并且只能是异步非阻塞调用(不会等待返回值)。
*/
jsCallback("回调 JavaScript 函数的参数",jsCallback);//正确用法!非阻塞,异步发起调用
/*
要避免在 JS 回调本地函数时再去阻塞调用 JS,就好比自己不能把自己抬起来。
这可能导致 WebView2 异常(例如死锁没反应,甚至退出进程重新运行也会异常)
调用 wb.eval, wb.xcall 时默认会阻塞等待 JS 返回值,
除非在指定了接收 JS 返回值的回调函数(异步调用,不会阻塞调用代码)。
在被网页回调的 aardio 函数内部应避免阻塞调用导致阻塞后续调用。
如果不需要返回值,改用 wb.invoke, wb.doScript 更轻量且不需要处理返回值与回调
调用 JS 函数: https://www.aardio.com/zh-cn/docs/examples/WebUI/web.view/xcall.html
*/
//wb.xcall("jsFunc","arg1"); //错误用法!
// wb.invoke, wb.doScript 都是非阻塞异步调用,不等待也不会获取返回值
wb.invoke("jsFunc","invoke"); //正确用法,使用 WebView2 异步调用优于同步阻塞调用
wb.doScript("jsFunc('doScript')"); //正确用法,使用 WebView2 异步调用优于同步阻塞调用
winform.setTimeout( function(){
//可能阻塞的代码放在这里
//var ret = wb.invoke("jsFunc","invoke");
});
thread.invoke(
function(wb){
//aardio 中优先使用异步调用 JS 的方式
//wb.invoke("jsFunc","invoke");
},wb
)
};
}
wb.html = /********
<!doctype html>
<html><head>
<meta charset="utf-8">
<style type="text/css">html,body{ height:100%; margin:0; } </style>
<script>
(async()=>{
jsFunc = function(arg1){
document.write(arg1," ");
}
await aardio.test(
function(str){
alert(str);
}
);
})()
</script>
</head>
<body></body></html>
********/
winform.show();
win.loopMessage();
Markdown 格式