原生JS封裝jQuery的AJAX

AJAX 的所有功能
  • 客戶端的JS發(fā)起請(qǐng)求(瀏覽器上的)
  • 服務(wù)端的JS發(fā)送響應(yīng)(Node.js上的)
JS操作請(qǐng)求與響應(yīng)

1.設(shè)置請(qǐng)求 request
第一部分 request.open('get', '/xxx')
第二部分 request.setRequestHeader('content-type','x-www-form-urlencoded')
第四部分 request.send('a=1&b=2')

2.獲取響應(yīng) response
第一部分:獲取狀態(tài)
request.statusText // 獲取請(qǐng)求狀態(tài)
request.status // 獲取HTTP響應(yīng)狀態(tài)
第二部分:獲取響應(yīng)header
request.getResponseHeader() // 獲取第二部分所有內(nèi)容
request.getAllResponseHeaders('Content-Type') // 獲取Content-Type的內(nèi)容
第四部分: 獲取響應(yīng)內(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)  //初始化請(qǐng)求
            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ā)送請(qǐng)求
        }

        window.$ = window.jQuery

調(diào)用:

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

此代碼有點(diǎn)傻,下面來(lái)優(yōu)化一下。


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

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

        window.jQuery.ajax = function ({ url, method, body, successFn, failFn, headers }) {  //ES6解構(gòu)賦值語(yǔ)法
            let request = new XMLHttpRequest()
            request.open(method, url)  //初始化請(qǐng)求
            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ā)送請(qǐng)求
        }

使用promise優(yōu)化

因?yàn)槊總€(gè)程序員的回調(diào)名不一樣,你不看文檔根本不知道這個(gè)庫(kù)的函數(shù)名是什么,所以我們可以使用該方法不用設(shè)置successFn、failFn這兩個(gè)函數(shù)的函數(shù)名。

返回一個(gè)promise對(duì)象,傳入的兩個(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)  //初始化請(qǐng)求
                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ā)送請(qǐng)求
            })
        }

調(diào)用:

        myButton.addEventListener('click', (e) => {
            window.jQuery.ajax({
                url: '/xxx',
                method: 'get',
                headers: {
                    'content-type': 'application/x-www-form-urlencoded',
                    'keller': '18'
                }
            }).then(
                (text) => { console.log(text) },
                (request) => { console.log(request) }
            )
        })

then返回也是promise對(duì)象,于是就有了鏈?zhǔn)讲僮鳌?/p>


jQuery本身的ajax方法

上面是我們模仿jQuery自己封裝的ajax方法,下面來(lái)看看jQuery真正的ajax調(diào)用方法。
舉例:

        // 方法1
        $.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') }
        })

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

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

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