原生JS封裝jQuery的AJAX


title: 原生JS封裝jQuery的AJAX
date: 2018-10-08 11:04:15
tags: [JavaScript]
categories: JavaScript


基本功能

設置請求request

第一步 let request = new XMLHttpRequest()
第一部分:
request.open('GET', '/xxx')
第二部分:(不能設置User-Agent,會報錯)
request.setRequestHeader('Content-Type', 'x-www-form-urlencoded')
第四部分:
request.send('a=0&b=1')

獲取響應response

第一部分:獲取HTTP狀態
request.status //200
request.statusText //OK

第二部分:獲取響應header
request.getAllResponseHeaders() //獲取第二部分所有內容
request.getResponseHeader('Content-Type') //獲取Content-Type 的內容

第四部分:
request.responseText()


封裝jQuery.ajax

初始版本

封裝:

window.jQuery.ajax = function(options){
    let url = options.url
    let method = options.method
    let body = options.body
    let successFn = options.successFn
    let failFn = options.failFn
    let headers = options.headers

    let request = new XMLHttpRequest()
    request.open(method, url)  //初始化請求
    for(let key in headers){
        let value = headers[key]
        request.setRequestHeader(key, value)
    }
    request.onreadystatechange = () =>{
       if(request.readyState === 4){
           if(request.status >= 200 && request.status <= 300){
               successFn.call(undefined, request.responseText)
           }else if(request.status >= 400){
              failFn.call(undefined, request)
           }
       }
    }
    request.send(body)  //發送請求
}

window.$ = window.jQuery

調用:

myButton.addEventListener('click', (e) =>{
    window.jQuery.ajax({
        url: '/xxx', 
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'allen': '23'
        } ,
        body: 'a=0&b=1', 
        successFn: (x) => {console.log(x)}, 
        failFn: (x) => {
            console.log(x)
            console.log(x.statusText)
            console.log(x.responseText)  //請求失敗也可以獲取第四部分
        }
     })
})

此時代碼很傻,下面來優化一下。


使用ES6語法解構賦值

ES6新語法之解構賦值,見MDN文檔
優化后的代碼:

window.jQuery.ajax = function({url, method, body, successFn, failFn, headers}){  //解構賦值語法
    let request = new XMLHttpRequest()
    request.open(method, url)  //初始化請求
    for(let key in headers){
        let value = headers[key]
        request.setRequestHeader(key, value)
    }
    request.onreadystatechange = () =>{
       if(request.readyState === 4){
           if(request.status >= 200 && request.status <= 300){
               successFn.call(undefined, request.responseText)
           }else if(request.status >= 400){
              failFn.call(undefined, request)
           }
       }
    }
    request.send(body)  //發送請求
}

使用promise優化

因為每個程序員的回調名不一樣,你不看文檔根本不知道這個庫的函數名是什么,所以我們可以使用該方法不設置successFn、failFn這兩個函數的函數名。
返回一個promise對象,傳入的兩個參數resolve、reject,分別代表成功時執行的內容和失敗時執行的內容。

再次優化后的代碼:

window.jQuery.ajax = function({url, method, body, headers}){
    return new Promise(function(resolve, reject){   // 這行代碼要記住
        let request = new XMLHttpRequest()
        request.open(method, url)  //初始化請求
        for(let key in headers){
            let value = headers[key]
            request.setRequestHeader(key, value)
        }
        request.onreadystatechange = () =>{
           if(request.readyState === 4){
               if(request.status >= 200 && request.status <= 300){
                  resolve.call(undefined, request.responseText)
               }else if(request.status >= 400){
                  reject.call(undefined, request)
               }
           }
        }
        request.send(body)  //發送請求
    })
}

調用:

 window.jQuery.ajax({
        url: '/xxx',
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'allen': '23'
        }
    }).then(
        (responseText) => {
            console.log(responseText);
            return responseText;
        },
        (request) => {
            console.log('error'); return 'error'
        }
)

then返回也是promise對象,于是就有了鏈式操作。

jQuery本身的ajax方法

上面是我們模仿jQuery自己封裝的ajax方法,下面來看看jQuery真正的ajax方法。
舉例:

$.ajax({
    url:'/xxx',
    method: 'post',
    dataType:'x-www-form-urlencoded',
    data:'a=0&b=1',
    success:(responseText)=>{console.log(responseText)},
    error:(e)=>{console.log('error')}
})

$.ajax({
    url:'/xxx',
    method: 'post',
    dataType:'json',
    data:'a=0&b=1',
}).then(
    (responseText)=>{console.log(responseText)},
    (e)=>{console.log('error')}
)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • AJAX 的所有功能 客戶端的JS發起請求(瀏覽器上的) 服務端的JS發送響應(Node.js上的) JS操作請求...
    Keller7閱讀 417評論 0 0
  • 前言:為了深入理解jQuery中的ajax方法,本文通過使用原生JavaScript來封裝一個類似的方法,能實現最...
    EnochQin閱讀 875評論 3 6
  • $HTML, HTTP,web綜合問題 1、前端需要注意哪些SEO 2、 的title和alt有什么區別 3、HT...
    Hebborn_hb閱讀 4,649評論 0 20
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 27,588評論 1 45
  • 願望:1願望我9月永利皇宮業績1200萬!2願望我9月執到超級多大客讓我大富大貴賺10萬!3願望我9月身體健康成長...
    謝奕鋒閱讀 174評論 0 0