哇哈哈哈
现在本人对YUI editor越来越自定义化了
在天天加班,呕心沥血,日你万机如此繁忙的情况下,今天终于得空,做了一点小小更新。(元旦看电影到一半被老大电话叫出来加班,也spoil了当天下午的滑冰计划,然后元旦后的这个周末,加班2天(寒……囧rz.....),然后把周二当成周九的情况下,今天1月8号终于产品上线了一个版本,哇哈哈哈,成就感还是有一点的。哈哈,扯远了。
今天稍微清闲,抽了点时间,加了一个小小按钮,就在输入框上面的那个"Js"模样的按钮,其实是以前的功能的一个增强,以前做了显示部分,没有做发表部分。
以后在blog上面show代码可以更漂亮一点了,哈哈。
现在就开始show一段吧。
Neil Mix 在07年2月份发布过一个著名的javascript 1.7线程机制模拟的
blog, 今天我就简单说说这个吧。
javascript是简单的脚本语言,这点大家都知道,那么,如何让这个似乎只适合在页面上做一些简单验证的语言实现java中那样复杂的线程机制呢? javascript 1.7的一个新特性给我们带来了这个可能性,虽然不知真正的线程机制,不过,它看起来确实很像线程。
这个实现的基础就是js1.7中
generator的加入。看看用如下的例子来实现的一个Fibonacci数列:
function fib() {
var i = 0, j = 1;
while (true) {
yield i;
var t = i;
i = j;
j += t;
}
}
var g = fib();
for (var i = 0; i < 10; i++) {
document.write(g.next() + "<br>\n");
}(大家看见了吗,上面这个漂亮的代码块就是我刚刚实现的新功能^^)
如果写过一些js的人就会发现,这里面有一些很奇怪的语法,永远跳不出的死循环,还有yield关键字,未定义的next()方法,没错,这就是js1.7最新引入的generator,目前只有firefox可以支持。
这个方法看起来虽然无聊,但是,Neil的
Thread.js就是靠这个为基础实现的。
看看Neil的这个
例子吧(只能用firefox打开),是不是真的很像线程?可以并发,可以等待,哈哈。
其实最主要的一点就是等待机制,每次一个“线程”在页面上写字(或者完成其他功能后),会通过sleep进入等待,给予其他的"线程"执行的时间。这个等待是这样实现的:
function count(elem, max) {
elem.innerHTML += "started ";
yield sleep(500);
for (var i = 1; i <= max; i++) {
elem.innerHTML += i + " ";
yield sleep(500);
}
elem.innerHTML += " done.";
}
function sleep(millis) {
setTimeout((yield CONTINUATION), millis);
yield SUSPEND;
}
通过yield不同的返回的object,Thread.js库中定义的函数将generator放入一个统一的执行函数,按照返回值的不同,对下一步的走向作出判断,在收到SUSPEND后,其实其函数执行就会被return中止,所以说,虽然这看起来像线程,其实不是线程,只是通过setTimeout精确控制的两个互相没有什么关系的函数调用过程罢了。
也不知自己讲清楚没有,至少目前我的理解如此,哈哈