首页 > 代码库 > Windjs的$await随笔

Windjs的$await随笔

  初识Windjs,了解很少,又没有文档和api,只能自己摸爬滚打找到需要的功能模块,每有会意,便随笔一篇。

  $await是Windjs的核心api。具体可check作者老赵博客: 浅谈Jscex的$await语义及异步任务模型

  $await的语义实际上只是“等待该任务结束”,同时:

  • 如果该任务没有运行,则启动该任务。
  • 如果该任务已经完成,则立即返回结果(或抛出异常)。

 

假设有三个任务A、B、C,执行时间分别是3000ms,5000ms,0ms。

场景一:并行

  假设三个任务是并行的,互不干涉,分别执行,这里用一般的js即可,Windjs实现如下:(大材小用)

技术分享
 1 var A = eval(Wind.compile("async", function () { 2   console.log("Start A"); 3   $await(Wind.Async.sleep(3000)); 4   console.log("Finish A"); 5 })); 6  7 var B = eval(Wind.compile("async", function () { 8     console.log("Start B"); 9     $await(Wind.Async.sleep(5000));10     console.log("Finish B");11 }));12 13 var C = eval(Wind.compile("async", function () {14     console.log("Start C");15     console.log("Finish C");16 }));17 18 A().start();19 B().start();20 C().start();
View Code

 

    场景二:串行

       假设三个任务是串行的,A执行完执行B,B执行完才能执行C。一般js可用setTimeout做回调。这时就有点搞了,我们的中心在于函数本身,不想搞乱七八糟的顺序问题。Windjs实现如下:

技术分享
 1 var A = eval(Wind.compile("async", function () { 2   console.log("Start A"); 3   $await(Wind.Async.sleep(3000)); 4   console.log("Finish A"); 5 })); 6  7 var B = eval(Wind.compile("async", function () { 8     console.log("Start B"); 9     $await(Wind.Async.sleep(5000));10     console.log("Finish B");11 }));12 13 var C = eval(Wind.compile("async", function () {14     console.log("Start C");15     console.log("Finish C");16 }));17 18 var run = eval(Wind.compile(‘async‘, function() {19   $await(A());20   $await(B());21   $await(C());22 }));23 24 run().start(); 
View Code

  这里$await就相当于将线程挂起了,直到参数的函数运行完线程才继续执行。

 

   场景三:并行+串行(依赖)

    假设任务A和B可以同时进行,而C则依赖于A和B,需要等它们都完成时才能执行。一般js可以把C写在A和B的回调里,保证A和B都执行完的情况下执行callback函数C。只能突出一个烦字...Windjs方式:

技术分享
 1 var A = eval(Wind.compile("async", function () { 2   console.log("Start A"); 3   $await(Wind.Async.sleep(3000)); 4   console.log("Finish A"); 5 })); 6  7 var B = eval(Wind.compile("async", function () { 8     console.log("Start B"); 9     $await(Wind.Async.sleep(5000));10     console.log("Finish B");11 }));12 13 var C = eval(Wind.compile("async", function () {14     console.log("Start C");15     console.log("Finish C");16 }));17 18 var run = eval(Wind.compile(‘async‘, function() {19   $await(Task.whenAll(A(),B()));20   $await(C());21 }));22 23 run().start(); 
View Code

  暂时Task.whenAll() api报错...

           

  

  

Windjs的$await随笔