基於jquery的ajax方法封裝

来源:http://www.cnblogs.com/fxxkhigh/archive/2016/07/14/5669904.html
-Advertisement-
Play Games

在實際的項目里,ajax的應用頻率很高,所以儘管jquery或者其他的一些類似的js庫做了非常不錯的封裝,仍然有進一步封裝簡化的空間和必要 舉一個例子,很久很久以前,我的ajax是這麼寫的: 乍一看挺好沒啥問題,但是其實success回調里的邏輯可能很複雜,甚至可能會出現ajax回調里再放一個aja ...


在實際的項目里,ajax的應用頻率很高,所以儘管jquery或者其他的一些類似的js庫做了非常不錯的封裝,仍然有進一步封裝簡化的空間和必要

舉一個例子,很久很久以前,我的ajax是這麼寫的:

$.ajax({
  url: 'www.baidu.com/getInfo',
  type: 'POST',
  data: {
    name: 'jack',
    age: 18
  },
  dataType: 'json',
  success: function(resp){
  // callback
  },
  error: function(err){
  // error code
  }    
});

乍一看挺好沒啥問題,但是其實success回調里的邏輯可能很複雜,甚至可能會出現ajax回調里再放一個ajax的情況,那這種寫法就很糟糕了,全都雜糅在一起

可以進行一個簡單的封裝,這在之前Deferred對象的隨筆里已經有提到

function ajax(url, param, type) {
  // 利用了jquery延遲對象回調的方式對ajax封裝,使用done(),fail(),always()等方法進行鏈式回調操作
  // 如果需要的參數更多,比如有跨域dataType需要設置為'jsonp'等等,可以考慮參數設置為對象
  return $.ajax({
    url: url,
    data: param || {},
    type: type || 'GET'
  });
}

// 鏈式回調
ajax('www.baidu.com/getInfo').done(function(resp) {
    // 成功回調
  }).fail(function(err) {
    // 失敗回調
  });

但是雖然做到這一步了,問題還是會來,比如我司,成功的回調里還有一層邏輯判斷,像這樣:

// 我司ajax返回的json數據格式
// 當result為false時,msg中往往有錯誤信息
{
  result: true,
  data: {
    name: 'jack'
  },
  msg: null
}

ajax('www.baidu.com/getInfo').done(function(resp) {
    // 成功回調
    if(resp.result){
      // 當resp中result為true時的操作
      // 往往這個時候要操作處理resp中的data對象信息
    }
    else{
      // 當result為false時的操作,這時往往會根據resp中的另一屬性msg來判斷具體處理
    }
  }).fail(function(err) {
    // 失敗回調
  });

問題有二:

第一,我每個ajax中都需要寫一個同樣的相對固定的邏輯判斷(每個公司或者項目組可能會有不同,但是就項目本身而言,或者放大了到公司來說必然是固定的),我覺得很煩。

第二,如果我只想專註處理數據,比如在成功回調里,我直接拿到要處理要渲染的數據,在失敗的回調里我直接拿到錯誤的代碼,有沒有這樣的可能做進一步的封裝。

其實這倆問題是一個,總結一句話,就是不想寫那麼多if,else。有一句話我覺得說得很好,邏輯是守恆的,但如果是可預見的邏輯,是有精簡的可能的,我們這種顯然屬於可預見的邏輯。

二次封裝利用了延遲對象的then方法,具體看代碼:

function handleAjax(url, param, type) {
  return ajax(url, param, type).then(function(resp){
      // 成功回調
      if(resp.result){
        return resp.data; // 直接返回要處理的數據,作為預設參數傳入之後done()方法的回調
      }
      else{
        return $.Deferred().reject(resp.msg); // 返回一個失敗狀態的deferred對象,把錯誤代碼作為預設參數傳入之後fail()方法的回調
      }
    }, function(err){
      // 失敗回調
      console.log(err.status); // 列印狀態碼
    });
}

handleAjax('www.baidu.com/getInfo').done(function(resp){
    // 當result為true的回調
  }).fail(function(err){
    // 當result為false的回調
  });

這就把之前很雜揉的代碼進一步的的簡化,也方便了維護,比如某一天跟你說result不再是布爾值了,直接改成狀態碼這樣的東西了,如果按以前一個ajax寫一個判斷,簡直要瘋。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 包裝類分為三節來介紹,本節主要介紹基本用法和共同點:與基本類型的相互轉換、裝箱/拆箱、重寫的Object方法、Comparable介面、與String的相互轉換、常用常量、Number、以及不可變性 ... ...
  • 1.激活Tomcat的defaultServlet來處理靜態文件,web.xml配置 a.說到了這裡另外說說url-pattern的配置 2.springmvc處理,spring-mvc.xml配置 3.會把"/**" url,註冊到SimpleUrlHandlerMapping的urlMap中,把 ...
  • 1.本次用到的控制項資料 按鈕組作為翻頁按鈕 : http://v3.bootcss.com/components/#btn-groups-single 2.工程地址:https://github.com/digitalClass/web_page 網站發佈地址: http://115.28.30.2 ...
  • 今天自己寫個樓層效果,有一點煩躁,小地方犯錯誤。各位大神來修改不足啊!!! ...
  • 一、特殊性規則 選擇器的特殊性由選擇器本身的組件確定;特殊性由四個部分組成,其初始值為0,0,0,0。 1. 對於選擇器中的每一個id,加0,1,0,0; 2. 對於選擇器中的每一個類、偽類、屬性選擇,加0,0,1,0; 3. 對於選擇器中的每一個元素、偽元素,加0,0,0,1; 4. 結合符與通配 ...
  • 一、要點: 1.頁面載入時,圖片重合,疊在一起[絕對定位]; 2.第一張顯示,其它隱藏; 3.設置下標,給下標設置顏色讓它隨圖片移動; 4.滑鼠移動到圖片上去,顯示左右移動圖標,滑鼠移走,繼續輪播; 二、實現代碼: html代碼: css代碼: js代碼: ...
  • what's BFC? 第一次看到這個名詞,我是拒絕的,css什麼時候還有這個東西?於是迫不及待的google了一下,才發現原來它無時無刻不在我們的css當中,只不過它並不是一個屬性,不需要我們平常使用手寫罷了。但是它的重要性確是杠杠的,可以這麼說,沒有它就就沒有什麼css佈局。 BFC,全稱 Bl ...
  • 《掃雷》是一款大眾類的益智小游戲,於1992年發行。游戲目標是在最短的時間內根據點擊格子出現的數字找出所有非雷格子,同時避免踩雷。線上試玩 http://hovertree.com/texiao/game/7/滑鼠左鍵標記非雷格子,右鍵標記地雷。如果左鍵點到地雷游戲失敗。 這是何問起掃雷成功的一個例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...