(转)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