在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();
异步,如此这般优雅