由于JS本身的应用场景很多需要异步交互,使用习惯上会使用大量的callback,这多少会造成代码的可读性低。wind.js的作用是把原先异步的代码结构改成顺序,这的确会提升可读性,但wind.js为实现这一功能引入额外的代码:
eval(Wind.compile("async", function () {
$await(异步方法);
其它方法;
}));
这是wind.js的基本结构,所有要改造的异步代码都要求改写成。如果代码中有10个异步调用就要套用10次。使用上还是比较繁琐(当然这不是wind.js的问题,语言及解析器限制)。 另外wind.js还可以解决多个异步依赖的问题,如: a操作需要b、c都完成才能继续,而b、c操作都是异步的且没有关联的,常规的可成:
function b(){
//async
function(){
c();
}
}
function c(){
//async
function(){
a();
}
}
这种做法无疑是很糟糕的,逻辑都打乱了,换成wind.js后可改成这样:
eval(Wind.compile("async", function () {
$await(b());
$await(c());
a();
}));
不错,这下好多了,但还有个问题,b、c是没有关联的,也就是b、c可以同时执行,而上面的代码却是分步的,一个更简单有效的做法是用JQ的deferred,如下:
var bDfd=$.Deferred();
var cDfd=$.Deferred();
function b(){
//async
function(){
bDfd.resolve();
}
return bDfd.promise();
}
function c(){
//async
function(){
cDfd.resolve();
}
return cDfd.promise();
}
$.when(bDfd&&cDfd).done(function(){
a();
});
逻辑清楚,代码可读性也很高。 所以如果代码不存在很多层的异步嵌套调用,建议不要引入wind.js,可以考虑从以下几个方面入手解决: 1.提升开发人员的技能,做JS开发异步回调是基础,不要畏惧; 2.优化代码结构及方法命名; 3.使用JQ的deferred。