解决金字塔回调问题的两种手段

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(){
    //失败处理
});

其实我觉得和我之前用的那种方式比较像.

标签: jquery, deferred, promoise, javascript, callback

添加新评论