異步模型看起來很美,但其實它也是有天生缺陷的.看下面代碼
try {
setTimeout( function(){
throw new Error( '你抓不到個人!' );
}, 100);
} catch (e) {
console.error(e);
}
若是你已經理解了上一篇博客,那你必定了解了這樣的寫法是捕獲不到錯誤e的,setTimeout是排在catch(e){}執行完畢後,捕獲錯誤時壓根還沒執行throw new Error()固然捕獲不到了.
一樣的道理
咱們也無法獲得異步函數的返回值.
var a;
setTimeout( function(){
a = 5;
},0);
console.info(a);//undefined
從編程風格上看,這樣也不夠友好,回調函數都直接耦合在異步函數中(雖然不少UI程序員認爲這樣才更習慣).
新式ajax:
$('ajax').then(successHandler, errorHandler)
老式ajax:
$('ajax',function(result){
process(result);
})
因而不少大牛就提出了Promises模式來解決異步函數的編程風格和上面提到的兩個缺陷,對應到JQuery裏的實現就是Callbacks模塊和Deferred,Callbacks用來存儲觸發回調函數,Deffered就是Promises模式的具體實現.