淺談angular中的promise

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

相關文章
相關標籤/搜索