因为在看win8时看到Promises的异步模式。kinfey让我们去摸下WindJS(就是之前的Jscex),WindJS的具体操作会在之后总结,可先看看文档http://windjs.org/cn/docs/。
看WinJS时接触到$await,从其作者--老赵的博客中可找到其描述。Check:浅谈Jscex的$await语义及异步任务模型
简单小结:
$await的语义:
- 如果该任务没有运行,则启动该任务。
- 如果该任务已经完成,则立即返回结果(或抛出异常)。
例子:假如有三个任务:A和B可以并行,但C依赖前两者。即A B并行,2个都完成之后到C,实现:
function (taskA, taskB, taskC) { taskA.start(); taskB.start(); $await(taskA); $await(taskB); $await(taskC); }
“任务A和B的start方法会在调用后立即返回,并在两者都完成后,才会启动并等待C任务。”
也可以这么做:
function (taskA, taskB, taskC) { $await(Jscex.Async.parallel(taskA, taskB)); $await(taskC); }
“Jscex.Async.parallel是一个辅助函数,接受一堆异步任务,并返回一个新的异步任务,执行它表示并行地执行这些子任务,它也会在子任务都完成后才结束。”
例2:C依赖于B,但A与前两者都独立。
function (taskA, taskB, taskC) { taskA.start(); $await(taskB.continueWith(taskC)); $await(taskA); }
“在JavaScript中,我们只要为Jscex.Async.Task对象扩展一个continueWith方法,表示taskC将于taskB之后执行,并作为一个新任务返回即可。”
其实这里的思想就是WinJS 中的Promises的then了。
最后,还支持赋值操作。
hello.world = $await(...);
从这里我们可以感受到WindJS是十分强大的,他让异步便得那么“符合逻辑”,那么简单。
补充:$await
只能直接用在eval(Jscex.compile())
里面,不然会报无定义,不能识别的错误。https://github.com/JeffreyZhao/wind/issues/50
本文转自老Zhan博客园博客,原文链接:http://www.cnblogs.com/mybkn/archive/2012/09/28/2707691.html,如需转载请自行联系原作者