(转)miniblink跨线程异步JS回调,及miniblink提升首屏加载速度的代码
转自:aardio培训群 , 感谢 Jacen He jacen提供代码
miniblink 不能回调JS确实非常麻烦,
因为用web做界面,很自然的会调用耗时操作,不能回调逻辑会变的很复杂。
针对这个aardio封装了一个函数,可以非常方便的弥补这个问题
import win.ui;
/*DSG{{*/
var winform = win.form(text="跨线程JS回调";right=759;bottom=469)
winform.add()
/*}}*/
import web.blink.form; //导入miniblink支持库
var mb= web.blink.form(winform); //创建miniblink浏览器窗口
//定义网页脚本可调用的本地函数
mb.external = {
aardioCall = function(callback){
/*
JS调用aardio函数且返回以后,参数中的JS对象将被释放。
所以我们需要用下面的代码封装并保存JS回调函数,
并由aardio负责在不需要时自动回收该函数。
*/
winform.jsCallback = mb.jsSaveCallback(callback);
//创建线程
thread.invoke(
function(winform){
sleep(1000);
/*
这时候对external.aardioCall()的调用已经结束,
但winform.jsCallback仍然可以正常使用,另外因为
已存为窗体的成员函数,也支持跨线程调用。
*/
winform.jsCallback("hello");
},winform
)
};
}
mb.html = /**
<body style="margin:27px;">
<br><a href='javascript:
external.aardioCall(
function(str){
alert(str);
}
);
'>调用aardio函数,然后异步回调参数中传过去的JS函数</a>
</div>
**/
winform.show();
win.loopMessage();
return winform;mb在回调中堵塞都不合适,所以先让他返回,用这个方法,JS代码里感受不到复杂度
mb提升首屏加载速度的代码:
for(i=1;10;1){
win.peekPumpMessage(,,0x113/*_WM_TIMER*/,0x113/*_WM_TIMER*/)
sleep(50);
}
mainForm.show();这个异步调用js , 其实很方便的用在很多地方,
mb.html = /**
<!DOCTYPE html>
<html>
<head>
<script>
external.aardioCall(
function(str){ alert(str); }
);
</script>
</head>
<body>
<h1>My Web Page</h1>
</body>
</html>
**/
winform.button.oncommand = function(id,event){
winform.jsCallback("哈哈")
}这样, 在界面上增加按钮也可以直接操作这个js功能了/
回复#3 @admin :
升级了ok可以了。传参数可以了。
----------------------------------
接下来是一个很头疼的问题。
关于页面交互里面所有的方法都需要写到 mb.external = { xxx} 里面,岂不是乱套,
未采用 跨线程异步JS回调 的时候我是将方法独立到类库,然后
mb.external = ..table.concat(mb.external,biz);
mb.external = ..table.concat(mb.external,biz.item);
concat的形式将方法整合到external里面,
想在这个基础上加上跨线程异步js回调,发现出问题了。
biz或者biz.item类里面,并没有 winform 和mb这可是头疼的问题啊,结果很头疼
回复#7 @admin :
http://www.miniblink.net/ ,我在他群里,小版本跑的很勤.速度和有多地方比aardio里带的那个dll提升了很多.
登录后方可回帖


运行提示 jsSaveCallback null,已更新最新版本 21.58