Can Jscex be used in composition?

7 views
Skip to first unread message

Rex

unread,
May 17, 2012, 1:01:47 AM5/17/12
to Jscex User Groups
Hi Jeffrey,

我看了Jscex的介绍后,觉得它不能支持composition(下面会解释),想和你这个原作者再确认一下。烦请你有空的时候简单答复一下,谢
谢。

当把eval(Jscex.compile())用在一个function funcA上时,可以在那个funcA里用$await()来等另一个
async的function结束,再继续执行$await之后的语句。这样,在funcA里形成了一个block call的效果。

如果它支持composition的话,那意味着任何一个funcB去call funcA,都能体会到block call的效果。比如funcB里
列在funcA后面的语句都会停顿,直到$await()返回并导致funcA返回。

从Jscex的介绍来看,它并不能这样用。其实我认为,如果JavaScript语言本身不做扩充的话,基本上没有可能可以做到composable
block call。

Thanks,
Rex

Jeffrey Zhao

unread,
May 17, 2012, 1:36:58 AM5/17/12
to Jscex User Groups
这种block call的效果只能在eval(Jscex.compile())过函数里使用,并且需要标记为$await,因此如果funcB是普通的函数的话,调用funcA是不会停顿的。

当然如果funcB是普通函数的话,$await(funcA())是没有任何问题的,比如这个例子,算法排序动画:

http://files.zhaojie.me/jscex/samples/async/sorting-animations.html?quick

这个链接是快速排序的,下面的代码是冒泡排序的,更容易看明白:

var compareAsync = eval(Jscex.compile("async", function (x, y) {
$await(Jscex.Async.sleep(10));
return x - y;
}));

var swapAsync = eval(Jscex.compile("async", function (array, x, y) {
var t = array[x];
array[x] = array[y];
array[y] = t;

repaint(array);

$await(Jscex.Async.sleep(20));
}));

var bubbleSortAsync = eval(Jscex.compile("async", function (array) {
for (var x = 0; x < array.length; x++) {
for (var y = 0; y < array.length - x; y++) {
var r = $await(compareAsync(array[y], array[y + 1]));
if (r > 0)
$await(swapAsync(array, y, y + 1));
}
}
}));

可以看到,在bubbleSortAsync里可以调用compareAsync和swapAsync。Jscex的存在目的就是为了便于异步任务的编写,组合,协调等等。

老赵 | Jeffrey Zhao
Blog: http://blog.zhaojie.me/
GitHub: http://github.com/JeffreyZhao/

Jeffrey Zhao

unread,
May 17, 2012, 1:38:21 AM5/17/12
to Jscex User Groups
Sorry,第二段应该是“当然如果funcB **不是** 普通函数的话”,即经过eval(Jscex.compile())的函数。

Rex

unread,
May 17, 2012, 2:06:09 AM5/17/12
to Jscex User Groups
这样看来,还可以进一步描述普通函数和Jscex函数的关系:

1,Jscex函数调用普通函数:属于正常的JavaScript函数调用。

2,普通函数调用Jscex函数:普通函数只是trigger了Jscex函数,前者并不期望后者的返回值或完成后的执行效果,就象timer调用
callback一样。

3,Block call的效果仅限于Jscex函数内部,以及Jscex函数之间。

这样写的话,比较适合让我这样的程序员快速理解Jscex。

-Rex


On May 16, 10:38 pm, Jeffrey Zhao <je...@live.com> wrote:
> Sorry,第二段应该是"当然如果funcB **不是** 普通函数的话",即经过eval(Jscex.compile())的函数。
>
> 老赵 | Jeffrey Zhao
> Blog:http://blog.zhaojie.me/
> GitHub:http://github.com/JeffreyZhao/
>
>
>
>
>
>
>
> -----Original Message-----
> From: Jeffrey Zhao
> Sent: Thursday, May 17, 2012 1:36 PM
> To: Jscex User Groups
> Subject: Re: [jscex] Can Jscex be used in composition?
>
> 这种block call的效果只能在eval(Jscex.compile())过函数里使用,并且需要标记为$await,因此如果funcB是普通的函数的话,调用funcA是不会停顿的。
>
> 当然如果funcB是普通函数的话,$await(funcA())是没有任何问题的,比如这个例子,算法排序动画:
>

> http://files.zhaojie.me/jscex/samples/async/sorting-animations.html?q...

Jeffrey Zhao

unread,
May 17, 2012, 2:25:18 AM5/17/12
to Jscex User Groups
Block call的效果不仅限于Jscex函数之间,只是Jscex函数(即
eval(Jscex.compile()) 后的函数)支持使用$await进行block call,但$await的对象不一定是Jscex函数的执行结果,只要是个满足约定的对象即可,它也可能是一个普通异步操作的绑定。

其实这些在文档里都已经写了吧:

https://github.com/JeffreyZhao/jscex/blob/master/doc/async/README-cn.md

Rex

unread,
May 17, 2012, 2:39:59 AM5/17/12
to Jscex User Groups
我的需求是提供给用户一个函数,用户可以await这个函数,当然用户要先把他自己的函数eval(Jscex.compile())一下。

我刚好想问如何定制自己的await的对象,就看见你给的link了,明天我仔细读一下。

Jeffrey Zhao

unread,
May 17, 2012, 2:59:32 AM5/17/12
to Jscex User Groups
好的,有问题继续交流。


老赵 | Jeffrey Zhao
Blog: http://blog.zhaojie.me/
GitHub: http://github.com/JeffreyZhao/
-----Original Message-----
From: Rex
Sent: Thursday, May 17, 2012 2:39 PM
To: Jscex User Groups
Subject: [jscex] Re: Can Jscex be used in composition?

Reply all
Reply to author
Forward
0 new messages