佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 關(guān)于前端ajax請(qǐng)求的優(yōu)雅方案(http客戶端為axios)

關(guān)于前端ajax請(qǐng)求的優(yōu)雅方案(http客戶端為axios)

熱門標(biāo)簽:銀行業(yè)務(wù) 團(tuán)購(gòu)網(wǎng)站 服務(wù)器配置 Linux服務(wù)器 科大訊飛語音識(shí)別系統(tǒng) 電子圍欄 Mysql連接數(shù)設(shè)置 阿里云

前言

AJAX,Asynchronous JavaScript and XML (異步的JavaScript和XML),一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開發(fā)技術(shù)方案。

異步的JavaScript:

使用 【JavaScript語言】 以及 相關(guān)【瀏覽器提供類庫(kù)】 的功能向服務(wù)端發(fā)送請(qǐng)求,當(dāng)服務(wù)端處理完請(qǐng)求之后,【自動(dòng)執(zhí)行某個(gè)JavaScript的回調(diào)函數(shù)】。

PS:以上請(qǐng)求和響應(yīng)的整個(gè)過程是【偷偷】進(jìn)行的,頁(yè)面上無任何感知。

下面話不多說了,來一看看本文的正文。

本文http客戶端為axios

先講個(gè)故事

類似axios這種支持Promise的API已經(jīng)很友好了,請(qǐng)求成功后我們可以從then的Response中拿到后端返回的數(shù)據(jù)。比如:

axios.get('/user/12345')
 .then((response) => {
 console.log(response);
 })
 .catch((error) => {
 console.log(error);
 });

數(shù)據(jù)在response.data中,這意味著我們每個(gè)請(qǐng)求都需要多做一次處理才能拿到實(shí)際的數(shù)據(jù)。

然后,實(shí)際場(chǎng)景后端基本不會(huì)直接把數(shù)據(jù)給我們,他會(huì)做一層封裝,比如response.data的結(jié)構(gòu)會(huì)是這樣:

{
 "date": "2017-12-14 15:21:38",
 "success": true,
 "obj": {
 ...
 },
 "version": "V1.0"
}

所以,response.data.obj才是我們真正要的數(shù)據(jù)啊喂,所以我們每個(gè)請(qǐng)求都需要再多做一次處理=_=

突然有一天,后端說,“response.data不再是對(duì)象,改成了JSON字符串,你做一下處理~”。

然后是的,每個(gè)接口,是每一個(gè),我們都需要改成JSON.parse(response.data).obj,半條命哦!

如果,后端再說,“我又改回對(duì)象了,你撤銷之前的處理吧~”。。。

如果,后端又說,“不是所有的都是對(duì)象,有一些還是JSON字符串,具體你看下更新的接口文檔~”。。。

如果,我們不曾相遇。。。

后來的我們

ES6 Proxy用于修改某些操作的默認(rèn)行為,等同于在語言層面做出修改,所以屬于一種“元編程”(meta programming),即對(duì)編程語言進(jìn)行編程。

Proxy可以理解成,在目標(biāo)對(duì)象之前架設(shè)一層“攔截”,外界對(duì)該對(duì)象的訪問,都必須先通過這層攔截,因此提供了一種機(jī)制,可以對(duì)外界的訪問進(jìn)行過濾和改寫。

要解除上述苦惱,我們需要對(duì)所有的接口請(qǐng)求做統(tǒng)一的封裝。如此一來,就算后端改來改去,我們只需修改一個(gè)地方甚至不用修改!

const apiService = new Proxy(axios, {
 get (target, propKey, receiver) {
 return function (...args) {
 return target[propKey](...args)
 .then((res) => {
  const resData = typeof res.data === 'string' ? JSON.parse(res.data) : res.data;
  return typeof resData.obj === 'string' ? JSON.parse(resData.obj) : resData.obj;
 })
 .catch((err) => {
  throw err;
 });
 }
 }
});

對(duì)應(yīng)的接口請(qǐng)求部分改為:

apiService.get('/user/12345')
 .then((data) => {
 console.log(data);
 })
 .catch((error) => {
 console.log(error);
 });

“你隨便改,我改一下算我輸!”

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • Vue CLI項(xiàng)目 axios模塊前后端交互的使用(類似ajax提交)
  • Vue官方推薦AJAX組件axios.js使用方法詳解與API
  • vue項(xiàng)目使用axios發(fā)送請(qǐng)求讓ajax請(qǐng)求頭部攜帶cookie的方法
  • vue 組件的封裝之基于axios的ajax請(qǐng)求方法
  • vue結(jié)合axios與后端進(jìn)行ajax交互的方法
  • 關(guān)于vue中的ajax請(qǐng)求和axios包問題
  • vue axios 在頁(yè)面切換時(shí)中斷請(qǐng)求方法 ajax
  • axios進(jìn)階實(shí)踐之利用最優(yōu)雅的方式寫ajax請(qǐng)求
  • 在Vue組件化中利用axios處理ajax請(qǐng)求的使用方法
  • vue使用Axios做ajax請(qǐng)求詳解
  • VUE 更好的 ajax 上傳處理 axios.js實(shí)現(xiàn)代碼
  • Ajax常用封裝庫(kù)——Axios的使用

標(biāo)簽:衢州 衡水 棗莊 廣元 江蘇 萍鄉(xiāng) 蚌埠 大理

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《關(guān)于前端ajax請(qǐng)求的優(yōu)雅方案(http客戶端為axios)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    东港市| 丹巴县| 特克斯县| 灵山县| 金堂县| 新蔡县| 涞水县| 嵩明县| 岫岩| 抚松县| 弥渡县| 磴口县| 湖州市| 东方市| 务川| 伊金霍洛旗| 新宁县| 梁河县| 兴安盟| 梁山县| 瓮安县| 甘谷县| 慈溪市| 新邵县| 青田县| 泰来县| 故城县| 日土县| 象州县| 全州县| 峡江县| 永清县| 柳江县| 嵊州市| 全椒县| 库车县| 灵川县| 青铜峡市| 和林格尔县| 德昌县| 金塔县|