promise目的就是爲了跳出回調地獄.老掉牙的東西,大神輕拍.promise
舉個最簡單的例子:請求數據(getData),解析數據(executeData),顯示數據(showData).spa
//獲取數據 function getData(callback){ callback && callback(); } //解析數據 function executeData(callback){ callback && callback(); } //顯示數據 function showData(callback){ callback && callback(); } //開始請求數據了 getData(function(){ executeData(function(){ showData(function(){ console.log("data showed"); }) }) })
傳統作法就是這樣,固然也能夠經過事件機制實現。事件機制相比於回調,回調是一對一,事件機制就是一對多。可是,缺點就是代碼極難閱讀,尤爲是混淆了複雜的業務邏輯,寫代碼註釋都很難補救。code
這時候promise出場了.blog
//獲取數據 function getData(){ var deferred = $q.defer();//建立一個延遲 //do something setTimeout(function(){ deferred.resolve(); //延遲執行完畢,沒問題啊 },1000); return deferred.promise;//返回promise,我給你個承諾,你等着 } //解析數據 function executeData(type){ var deferred = $q.defer(); //do something setTimeout(function(){ deferred.reject();//出事了,數據不對 },1000); return deferred.promise; } //顯示數據 function showData(){ var deferred = $q.defer(); //do something deferred.notify();//持續發送消息,gogogogo,用來更新進度什麼的 return deferred.promise; } //立刻帥多了 getData() .then(executeData.bind(window,["test"]))//經過bind修改參數 .then(showData) .catch(function(){ //中途運行deferred.reject的話,就觸發catch console.log("error"); }) .finally(function(){ //所有執行完就finally console.log(end); });
上面註釋相信寫得很清楚了。能夠使用bind自定義參數。還有$q.all([promise1,promise2,promise3])能夠同時執行多個promise,跟執行順序跟上面有區別。事件
爲何叫作$q,$q的全稱是什麼,知道的請@死我。get