javascript 的 线程
首先我想实现一个有优先级队列/缓存/对象池的 connection manager。
但现在受困于javascript的单线程。
场景1:
一个队列正逐个pop command 去fire request。这时候需要响应用户操作在两个command中插入一个高优先级的command。
思路1:一个command完了有一个interval,这段时间内有操作的话fire一个request,用它的回调更改这个command queue。
思路2:一个command完了有一个interval,这段时间内有操作的话更改这个command queue,将这个队列锁住,interval延长,完成后queue解锁,直接跑下一个command。
关键:interval内用户必须执行操作,要不command只能下次加入队列了。还是单线的 :)
场景2 :
在一个异步回调中不能发请求,有没有办法hack一下?这样我只用在主线程管队列,callback的线程里连接干活了。。
场景3:
队列正在工作,按序发请求,最后来了个command,要abort掉前面的操作,但send后服务器已经开始工作了,有什么办法可以让服务器停止处理这个请求么?
都是些粗浅的想法,大虾见笑了,纯属抛砖引玉~
------解决方案--------------------如果你要用多线程,模拟得真实一些的话,可以试试用iframe来实现
------解决方案--------------------:D
iframe果然不错。不过IE的alert很BT呢。。
<iframe style= "display:none; "> </iframe>
<script type= "text/javascript ">
window.onload = function () {
var frame = window.frames[0], i = 0;
var func = frame.window.func = function () {
document.getElementById( "status ").innerHTML = i ++;
frame.window.setTimeout(func, 1000);
}
frame.window.func();
window.setTimeout( "alert(1) ", 5000);
};
</script>
<div id= "status "> </div>
------解决方案--------------------虽然和我发的那个执行iframe的setTimeout不同不过FF的alert和IE的不同。。。
对于
2. 先前贴子里那个alert阻塞了哪个线程? 问题。。应该已经是答案了吧。。
对于XMLHTTP貌似可以实现多线程的效果。。。不过没具体测试过。。。
因为它可以实现一次弹出多个alert(在IE里)
http://www.zhb.org.cn/wc/ajax/
这个是xmlHTTP的测试。。IE是若干个alert,FF则是一个。。。
下面的code是测试iframe的IE和FF差别结果。。
<iframe style= "display:none; "> </iframe>
<script type= "text/javascript ">
window.onload = function () {
var frame = window.frames[0], i = 0;
var func = frame.window.func = function () {
document.getElementById( "status ").innerHTML = i ++;
frame.window.setTimeout(func, 1000); //这个IFRAME的ALERT不会阻止
//另外iframe里还可以这样写IE则不行
//*****this.setTimeout(this.func, 1000)
//window.setTimeout(func, 1000); //这个则会阻止
}
frame.window.func();
window.setTimeout( "alert(1) ", 5000);
};
</script>
<div id= "status "> </div>
------解决方案-------------------- 1. 异步回调是不是多线程?
2. 先前贴子里那个alert阻塞了哪个线程?
首先,一个page在脚本运行只有一个thread,如果能够调用activeX做的muti-thread,那是另外一回事。
应该说这两个问题都是不属于脚本方面的事了
因为如果你用XMLHTTP的话,XMLHTTP的异步是ActiveX(ie7.0以下版本)管的事,activeX拥有多线程的性质。ActiveX本身的性质发出的request,属脚本不可控制范围(除了几个API)。但如果回到脚本之后,仍然是单线程。
题外的一些话:alert在IE里和mozilla里都不一样的,但它们的参考里都是这个意思:
Displays a dialog box containing an application-defined message。
但mozilla和IE的kernel不同,这得看具体情况而定
about:
Iframe很好
用Iframe处理可以并行的发一些请求,但本身自己的复杂性至少要上升一个数量级?
包括sibling间的交互.top-iframes间的交互。
这个要看怎么处理了,这中间多了一个交互的代码,关键看怎么处理和控制iframe。封装得好的话应该问题不大,把iframe看作是一个thread对象,用一个object来管理,用一个array当作线程池。