vue axios 簡單封裝以及思考

来源:https://www.cnblogs.com/huangenai/archive/2018/10/09/9760039.html
-Advertisement-
Play Games

先安裝 axios axios的詳細介紹以及用法 就不多說了請 移步 github ➡️ https://github.com/axios/axios 下麵是簡單的封裝一個 http.js, 在此說明 checkStatus 這個方法呢 是不一定需要的 ,根據個人的項目需求吧,也可以直接返回resp ...


先安裝 axios

npm install axios

axios的詳細介紹以及用法 就不多說了請 移步 github ➡️  https://github.com/axios/axios

 

下麵是簡單的封裝一個 http.js, 在此說明  checkStatus 這個方法呢 是不一定需要的 ,根據個人的項目需求吧,也可以直接返回response,交給後面另行處理也行。

或者根據後端返回的狀態,在裡面進行處理 也行。

"use strict";

import axios from "axios";
import qs from "qs";

//添加請求攔截器
axios.interceptors.request.use(
  config => {
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

//添加響應攔截器
axios.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    return Promise.resolve(error.response);
  }
);

axios.defaults.baseURL = "https://www.xxxx/api";
axios.defaults.headers.post["Content-Type"] = "application/json";
axios.defaults.headers.post["X-Requested-With"] = "XMLHttpRequest";
axios.defaults.timeout = 10000;

function checkStatus(response) {
  return new Promise((resolve, reject) => {
    if (
      response &&
      (response.status === 200 ||
        response.status === 304 ||
        response.status === 400)
    ) {
      resolve(response.data);
    } else {
      reject({
        state: "0",
        message: "網路異常"
      });
    }
  });
}

export default {
  post(url, params) {
    return axios({
      method: "post",
      url,
      data: params
    }).then(response => {
      return checkStatus(response);
    });
  },
  get(url, params) {
    params = qs.stringify(params);
    return axios({
      method: "get",
      url,
      params
    }).then(response => {
      return checkStatus(response);
    });
  }
};

 

在vue 項目中,main.js這個文件

import http from "./utils/http";


Vue.prototype.$http = http;

使用 helloworld.vue

...
methods: {
    async TestPost() {
      try {
        const res = await this.$http.post("/message/socketid", {
          account: "huangenai"
        });
        console.log(res);
      } catch (error) {
        console.log(error);
      }
    },
    async TestGet() {
      this.$http
        .get("/price")
        .then(res => {
          console.log(res);
        })
        .catch(error => {
          alert(error);
        });
    }
}
....

 

在main.js中將http.js import 進來 並暴露到全局使用,在任何vue 頁面中 就不再需要 import http.js了,而直接通過 this.$http.post this.$http.get 來使用,在checkStatus中統一非同步返回,順便可以處理錯誤的情況。

 

個人思考:

checkStatus方法 返回了一個 Promise

鏈式結構的話看上面那個get的方法,this.$http.get(...).then(...).catch(...),如果then 裡面又來一個 http請求 會一層包住一層。

如果使用了語法糖 async  await  ,雖然 看起來好像是簡單了 不用 一層包住一層 層層嵌套,可是你必須要用到 try catch,如果出現異常 則直接到catch,不會再執行下麵到方法。如果再實際業務中,就算出現了某一個http請求失敗到情況,不影響下麵的邏輯要繼續跑下去呢,這個就不適用了。鏈式結構也是 如果catch到異常 也不會執行then 裡面到方法了。

所以,是否把返回的Promise,全部都返回的是 resolve,那麼 就不會說出現直接到了 catch 裡面不執行以下的業務了邏輯了呢。而且如果使用了語法糖 await 代碼看起來更加簡潔 也不需要 try catch了, 這樣的話 reject是不是就不需要用到了呢。

function checkStatus(response) {
  return new Promise(resolve => {
    if (
      response &&
      (response.status === 200 ||
        response.status === 304 ||
        response.status === 400)
    ) {
      resolve(response.data);
    } else {
      resolve({
        state: "0",
        message: "網路異常"
      });
    }
  });
}

個人覺得這兩種方案各有優劣,實際應用中還是應該根據個人業務需求 業務情況而定。

 


此隨筆乃本人學習工作記錄,如有疑問歡迎在下麵評論,轉載請標明出處。

如果對您有幫助請動動滑鼠右下方給我來個贊,您的支持是我最大的動力。


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

-Advertisement-
Play Games
更多相關文章
  • 慶祝 2018 國慶,製作了一個 的種子下載器。爬取頁面,根據頁面的鏈接,破解另外一個網站,下載種子文件,同時使用 模塊提高爬蟲的併發量。項目比較簡單,爬取頁面沒有使用任何爬蟲框架。 的安裝請看我的另外一篇文章, "Node.js 的多版本安裝" 。 項目初始化 新建一個文件夾 ,在該文件夾下打開命 ...
  • 今天面試的時候被問到一個問題,是關於 JS 非同步的。當時我腦海中閃過了一個單線程的概念,但卻沒有把真正的原理闡述清楚。所以回來特意重新回顧了前面單線程和非同步相關的一些知識點。 雖然之前學習的時候也接觸了單線程模型相關的東西,但當時理解得並不是很清楚和明白。所以這道面試題也沒有給出一語中的的答案。重新 ...
  • javascript是面向對象的語言,Function也是一種對象,有自己的屬性和方法。call和apply就是js函數自帶方法,掛在Fucntion.prototype上。 一般調用某函數時,直接“函數名(參數)”的寫法即可,函數內部的this指向函數的調用者。 call和apply的作用是給函數 ...
  • 可以根據屏幕尺寸提供完全不同的圖片,為那些沒有必要下載全尺寸大圖的設備節省帶寬。 ...
  • 這裡附一篇自己的簡短理解 get相對於post更不安全,雖然都可以加密 get的參數會顯示在瀏覽器地址欄中,而post的參數不會顯示在瀏覽器地址欄中; 使用post提交的頁面在點擊【刷新】按鈕的時候瀏覽器一般會提示“是否重新提交”,而get則不會; 用get的頁面可以被搜索引擎抓取,而用post的則 ...
  • .not() 遍歷方法 從匹配元素集合中移除元素 :not() 選擇器 選取除了指定元素以外的所有元素。 獲取ul中除 id="unwanted" 的其他所有 li ...
  • 首先我們在pages文件夾下創建components目錄用於存放自定義組件。如圖所示,以我創建的dialog組件為例,自定義組件的格式與頁面一樣,分為4個文件。 圖1 圖2 如上圖2所示,假如index頁面有一個按鈕觸發點擊事件後彈出dialog,並且當點擊某個部門時,將dialog關閉,並將部門名 ...
  • Introduce(介紹) 用戶簽到的H5例子(css+jquery,無圖片),由於網上找的的用戶簽到例子都不好,要不就是好多圖片組成的,要不就大量冗餘代碼,所以特意做了個簽到界面(移動端)。 User sign sample page for mobile using h5 which only ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...