javascript异步模型 wind.js使用技巧
发布于 2年前 作者 151263 3115 次浏览

在ajax,nodejs横行的今天, 由于javascript语言本身的缺陷,无法优雅地表示异步调用流程,

比如:在异步调用中,是无法使用哪怕原来在同步中最简单的try…catch…语句跟for循环的. 必须使用递归来代替for循环, 没有任何其他办法.因为for循环的循环体无法暂停哪怕一毫秒.

这会让原本清晰的逻辑弄得支离破碎,代码无法清晰地表示业务流程 针对于此: wind.js 优雅地 解决了这个问题.

再来看看wind.js的使用技巧:

1, 在wind.js中,所有的异步方法返回的都是一定是一个代理对象,Task 在使用的过程中,可以手动的操作Task对象

2, $await 方法永远只接受Task对象, 语义表示的意思是, 等Task代理对象返回真正的值之后继续往下执行,具体看冒泡排序

3, 在有$await 的地方,这个方法一定必须是一个异步方法, 也就是这个方法必须被eval(Wind.compile("async",function() { … })); 包裹着.

4, Task可以使用start()方法手动启动,表示异步调用开始执行, 比如:开始发出ajax请求,开始读文件等

5, 所有被eval(Wind.compile("async",function() { … })); 包裹着的异步方法的返回值永远是一个Task代理对象

6, 说了那么多,再来看一个真实的案例,合并javascript源代码文件:

在nodejs中,安装wind: npm install wind

var fs = require("fs");
var Wind = require("wind");
var Task = Wind.Async.Task;

var Binding = Wind.Async.Binding;
var readFileAsync = Binding.fromStandard(fs.readFile);

//合并js文件的方法,paths是一个需要合并的js文件的路径数组
//方法体里面有用到了,$await,所以这个方法必须是异步方法
var mergerJsAsync = eval(Wind.compile("async",function(paths){
    //合并之后的js源代码
    var src = "";
    var pathTks = [];
    //循环获得所有readFile返回的Task代理对象
    //本来,如果readFile是同步方法的话,返回的是真实的值,
    //但是在这里,readFile是异步方法,所以返回的是Task代理对象
    for(var i=0; i<paths.length; i++) 
        pathTks.push(readFileAsync(paths[i],"utf-8"));
    //让pathTks代理对象数组并发执行,同时开始读取文件
    var files = $await(Task.whenAll(pathTks));
    for(var i=0; i<files.length; i++) src += files[i];
    //合并之后的js源代码,可以writeFile到某路径下
    console.log(src);
}));

//mergerJsAsync()返回一个Task代理对象
mergerJsAsync(["./test1.js","./test2.js"]).start();

异步,如此这般优雅

回到顶部