WindJS 中的$await

因为在看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

 

原文地址:https://www.cnblogs.com/mybkn/p/2707691.html