AngularJS封裝$http.post()執行個體詳解,angularjshttp.post

來源:互聯網
上載者:User

AngularJS封裝$http.post()執行個體詳解,angularjshttp.post

  AngularJS封裝$http.post()執行個體詳解

用了不是很長的時間跟了一個移動APP項目,用的是ionic + AngularJS + cordova架構,其間遇到過挺多問題,其中一個就是對Ajax的封裝問題。

其實針對封裝問題一直以來就沒停止過談論,不同的項目也有不同的需求,舉個典型的例子,我在做這個項目的時候因為一開始沒有考慮封裝問題所以被批評了,而我的一個朋友卻因為封裝了受到了批評……很尷尬不是麼。

那麼對於是否要封裝這個問題,究竟該怎麼界定?其實這不是一個很複雜的問題,歸根到底就是一個收益比率的問題,如果項目規模不是很大,那麼過多考慮封裝問題本身就沒什麼意義,對於項目的收益極低;而對於規模大的項目來說,如果不封裝,那麼潛在的風險就高得多,所以前期的投入也是值得的。

當然這個問題並不是我這樣一個小白能掰扯清楚的事情,今天就來說說如果考慮封裝的話,那麼我會怎麼處理。

angularjs中提供了一個服務http,它用來處理Ajax請求,這裡我假設讀者是瞭解angularjs的,所以直奔主題:對於post請求該如何處理封裝。首先我需要確定一個事情,我能否排除所有使用者(項目團隊成員)的個人化需求(需特殊處理的情況)。如果我不能,那麼我該如果開放介面才能將post請求還原,所以我需要一個出口返回http.post()。

第二點,我需要考慮每一個使用者在應答到來時如何處理結果,針對success和error兩種情況,我需要為他們提供一個處理邏輯的入口。

綜合上面兩點,我大概有了思路,我需要定義一個服務(公用服務),並且提供一個myPost方法,其中我允許使用者定義響應的回調,並且我允許他們取得更自由的處理方式,給他們一個原原本本的post()。好在js足夠靈活,所以我可以這樣來寫:

service('myHttpService', ['$http', function ($http) {  var myHttpPost = function (url, data, successFn, errorFn) {  }  return {    myHttp: function (url, data, successFn, errorFn) {      return myHttpPost(url, data, successFn, errorFn);  }  }}]);

如上,我會return內部定義的方法,這個方法允許使用者定義successFn和errorFn,即相應成功和失敗的回調,如此一來使用者大可放心的預先編寫資料的處理邏輯,而無需關心其他細節。

另外,我允許使用者拿到更加靈活的post(),那麼我是這樣實現的:

var httpPromise = $http.post(url, data, {timeout: 30000});if (!angular.isDefined(successFn)) {  return httpPromise;}

如果使用者並沒有定義成功回調,好吧,這層封裝就當是不存在,我會把post()丟出去,由調用者自行處理。而如果調用者想預先定義的話,我應當在封裝中處理好他們的邏輯:

return httpPromise.then(    function (response) {     if (response.status) {      return successFn(response);     } else {      /*其他處理*/     }    },    function (error) {     if (!angular.isDefined(errorFn)) {      /*其他處理*/     } else {      return errorFn(error);     }    },   function () {    /*無論何總情況下都應該被執行的邏輯*/   })

如此對於http.post()的封裝基本上就算是完成了。其中有一個地方需要注意,如果我在處理successFn的時候,用了angular.isDefined()判斷調用者是否定義了回調,如果沒有,我將把處理權利交給調用者,如果已定義我將代為處理。其中then()方法比較有趣,因為http方法返回的是一個promise對象,在響應返回的時候可以通過then()來處理響應,其實完全可以通過promise.success()和promise.error()來處理不同響應狀態的回調,但是用then()更好一些,因為它接收到的是完整的響應對象,而success()和error()會對響應對象進行解析,具體的差別讀者可以通過console輸出來看看。

以上是我對$http.post()的一次簡單封裝,雖然簡陋,但是足以應付大多數情形,並且保留了更自由的處理方式,非常感謝和我一起討論的朋友們,一起探討這次的封裝,收穫很大,也希望對其他朋友所有協助。

 感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.