解决金字塔回调问题的两种手段
javascript确实是一门在设计和使用上与主流语言上有着很多区别的语言,但一点也不妨碍她成为一门优雅的语言.
但是习惯了顺序执行的coder(指我自己)使用javascript的异步操作容易产生金字塔回调的问题(无止尽的回调套回调).最常见的就是按顺序异步操作.
ajax(url1, function(){
ajax(url2, function(){
...
});
});
之前遇到这个问题时,我想到了小时候玩的多米诺骨牌,确保前一个倒下能推到自己,自己倒下以后能推到后面一个.(以jQuery的自定义事件方式实现).
jQuery(obj).on('setup1', function(){
ajax(url1, function(){
jQuery(obj).trigger('setup2');
});
});
jQuery(obj).on('setup2', function(){
ajax(url2, function(){
jQuery(obj).trigger('setup3');
});
});
...
后来有人提出了Promise(貌似已经纳入了es6,并且已经有部分浏览器实现了),我的理解就是在一个执行对象中加入了两种状态:成功,失败.执行完成后会调用对应的callback,jQuery在1.5已经有了类似的实现,叫做Deferred.
jQuery.Deferred(function(def){
ajax(url1, function(){
def.resolve();
}, function(){
//failed
def.reject();
});
}).done(function(){
ajax(url2, function(){
...
});
}).fail(function(){
//失败处理
});
其实我觉得和我之前用的那种方式比较像.