原生JS封裝jQuery的AJAX


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


基本功能

設(shè)置請求request

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

獲取響應(yīng)response

第一部分:獲取HTTP狀態(tài)
request.status //200
request.statusText //OK

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

第四部分:
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)  //發(fā)送請求
}

window.$ = window.jQuery

調(diào)用:

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)  //請求失敗也可以獲取第四部分
        }
     })
})

此時(shí)代碼很傻,下面來優(yōu)化一下。


使用ES6語法解構(gòu)賦值

ES6新語法之解構(gòu)賦值,見MDN文檔 。
優(yōu)化后的代碼:

window.jQuery.ajax = function({url, method, body, successFn, failFn, headers}){  //解構(gòu)賦值語法
    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)  //發(fā)送請求
}

使用promise優(yōu)化

因?yàn)槊總€(gè)程序員的回調(diào)名不一樣,你不看文檔根本不知道這個(gè)庫的函數(shù)名是什么,所以我們可以使用該方法不設(shè)置successFn、failFn這兩個(gè)函數(shù)的函數(shù)名。
返回一個(gè)promise對象,傳入的兩個(gè)參數(shù)resolve、reject,分別代表成功時(shí)執(zhí)行的內(nèi)容和失敗時(shí)執(zhí)行的內(nèi)容。

再次優(yōu)化后的代碼:

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)  //發(fā)送請求
    })
}

調(diào)用:

 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對象,于是就有了鏈?zhǔn)讲僮鳌?/p>

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')}
)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容