首页 > 代码库 > 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();
场景二:串行
假设三个任务是串行的,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();
这里$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();
暂时Task.whenAll() api报错...
Windjs的$await随笔
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。