色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

核心功能具體的執行過程-2

汽車電子技術 ? 來源:知碼前端 ? 作者:清清玄 ? 2023-03-01 09:59 ? 次閱讀

前言

上一節我們簡單的介紹了一下 axios 的整體加載流程和使用過程。可以清楚的了解到當 import axios from 'axios' 之后 這背后到底做了什么。并且我們也簡單介紹了一個 axios 到底是一個什么類型的數據。以及為什么可以即可以當成方法調用還可以通過對象的調用方式調用某些屬性方法

如果沒有了解的同學可以先去看一下上一篇文章的介紹,再來繼續往下看。


這篇我們主要講解一下 axios 中的 配置、攔截器和執行鏈等一些核心的功能到底是怎么運行的。

02

配置過程

要了解這個之前,我們先來看一下 axios 在使用的時候一種方式:

axios.create({ ...配置項 })

不知道大家有沒有使用過種方式,這種方式可以讓我們傳遞一些配置到 axios 的內部,具體實現如下:

axios.create = function create(instanceConfig) {
  return createInstance(mergeConfig(axios.defaults, instanceConfig));
};

沒錯,最終又調用了 createInstance 函數,再來看一下函數體吧:

function createInstance(defaultConfig) {
  var context = new Axios(defaultConfig);
  var instance = bind(Axios.prototype.request, context);

  // Copy axios.prototype to instance
  utils.extend(instance, Axios.prototype, context);

  // Copy context to instance
  utils.extend(instance, context);

  return instance;
}

有一個函數需要關注一下就是 mergeConfig, 這個函數會把 axios 自帶的配置和我們傳入的配置進行合并,我們傳入的配置會覆蓋 axios 自帶的配置,也就是說我們傳入的配置優先級會更高。

由于這個 mergeConfig 函數體太大,我們就不細說了,大家有興趣可以看一下源碼。

這里要繼續說一下,我們在發送某個具體的請求的時候也可以進行配置,這樣就有三個配置。

優先級依次是:某個具體請求配置 > 創建實例對象配置 > axios 默認配置

03

上節說過,axios可以像對象那樣調用屬性方法,如 get、post等,其實最終都會調用 request 方法,代碼如下:

utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, config) {
    return this.request(mergeConfig(config || {}, {
      method: method,
      url: url,
      data: (config || {}).data
    }));
  };
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, data, config) {
    return this.request(mergeConfig(config || {}, {
      method: method,
      url: url,
      data: data
    }));
  };
});

可以看出最終都會調用到 this.request 方法。那我們來重點看一下 request方法具體做了什么。

先看一下函數體吧,代碼也不是很多:

Axios.prototype.request = function request(config) {
  /*eslint no-param-reassign:0*/
  // Allow for axios('example/url'[, config]) a la fetch API
  if (typeof config === 'string') {
    config = arguments[1] || {};
    config.url = arguments[0];
  } else {
    config = config || {};
  }

  config = mergeConfig(this.defaults, config);

  // Set config.method
  if (config.method) {
    config.method = config.method.toLowerCase();
  } else if (this.defaults.method) {
    config.method = this.defaults.method.toLowerCase();
  } else {
    config.method = 'get';
  }

  // Hook up interceptors middleware
  var chain = [dispatchRequest, undefined];
  var promise = Promise.resolve(config);

  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    chain.unshift(interceptor.fulfilled, interceptor.rejected);
  });

  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    chain.push(interceptor.fulfilled, interceptor.rejected);
  });

  while (chain.length) {
    promise = promise.then(chain.shift(), chain.shift());
  }

  return promise;
};

主要有三點:

1、生成配置項

2、生成攔截器、執行鏈

3、返回執行鏈的結果

下面我們重點介紹一下 2 是如何生成攔截器和執行鏈的

每個axios實例都會有一個 interceptors 屬性,如下:

function Axios(instanceConfig) {
  this.defaults = instanceConfig;
  this.interceptors = {
    request: new InterceptorManager(),
    response: new InterceptorManager()
  };
}

interceptors里面存放著 request 攔截器和response攔截器。InterceptorManager 中有一個 handlers 屬性,是一個數組存放著具體的攔截器,再來看一個比較熟悉的方法:

InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  this.handlers.push({
    fulfilled: fulfilled,
    rejected: rejected
  });
  return this.handlers.length - 1;
};

相信大家肯定用過這個 use 方法,這個方法接收兩個函數類型的參數,再封裝成一個對象放到 handlers中。
再回到 request 函數體中,看一下

  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
      chain.unshift(interceptor.fulfilled, interceptor.rejected);
  });

  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    chain.push(interceptor.fulfilled, interceptor.rejected);
  });

通過遍歷把 handlers 的攔截器都放到一個 chain 中,尤其要注意:this.interceptors.request 這個操作,是把最后的攔截器放到 chain的最前面。最終形成以下鏈接:

poYBAGP-sDKAOH_5AADszCSjWMI370.png

當然這還不是最終的 chain,因為前面

var chain = [dispatchRequest, undefined];

有這樣行代碼,所以最終的 chain 應該是下面的:

poYBAGP-sDyAKYAzAAEKkVnDApk539.png

這才是一個最終的 chain 。也就是說我們執行的每個請求都是執行了一個鏈,最終返回了一個 promise對象,是不是感覺也沒有那么神秘,看一下執行代碼,很簡單

varpromise=Promise.resolve(config);
while (chain.length) {
    promise = promise.then(chain.shift(), chain.shift());
  }
return promise;

以上便是 axios 發送某個請求的全過程,那么接下來我們繼續看一下到底是怎么發送的請求。

04

具體請求

從上面我們可以看到axios發送的請求就是一個鏈的執行過程,除去 request 和 response的攔截器不說,我們重點說一下:dispatchRequest 這個方法的執行過程,因為具體的請求就是在這個方法中執行的。先來看一下源碼:

module.exports = function dispatchRequest(config) {
  throwIfCancellationRequested(config);

  // Ensure headers exist
  config.headers = config.headers || {};

  // Transform request data
  config.data = transformData(
    config.data,
    config.headers,
    config.transformRequest
  );

  // Flatten headers
  config.headers = utils.merge(
    config.headers.common || {},
    config.headers[config.method] || {},
    config.headers
  );

  utils.forEach(
    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
    function cleanHeaderConfig(method) {
      delete config.headers[method];
    }
  );

  var adapter = config.adapter || defaults.adapter;

  return adapter(config).then(function onAdapterResolution(response) {
    throwIfCancellationRequested(config);

    // Transform response data
    response.data = transformData(
      response.data,
      response.headers,
      config.transformResponse
    );

    return response;
  }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
      throwIfCancellationRequested(config);

      // Transform response data
      if (reason && reason.response) {
        reason.response.data = transformData(
          reason.response.data,
          reason.response.headers,
          config.transformResponse
        );
      }
    }

    return Promise.reject(reason);
  });
};

方法本身并不難理解,處理一下請求頭然后再通過轉換器轉一下請求數據,最后通過一個適配器執行請求。下面我們再看一下適配器是什么,看一下下面的代碼

  var adapter = config.adapter || defaults.adapter;

適配器是通過配置獲取的,平時的開發中我們幾乎不需要自己定義適配器,一般都是用系統默認的,所以我們看一下默認的適配器是怎么樣的。下面是默認配置的代碼:

adapter: getDefaultAdapter(),

繼續看:

function getDefaultAdapter() {  var adapter;
  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = require('./adapters/xhr');
  } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
    // For node use HTTP adapter
    adapter = require('./adapters/http');
  }
  return adapter;
}

看到這里應該大體的有點明白了吧,其實就是我們平時用的 XMLHttpRequest 對象,那為什么還要做一個適配器呢,主要是因為 axios 不僅僅是一款可以用在 瀏覽器的庫,在 node 開發中也可以使用,但node中沒有 XMLHttpRequest對象,就得通過其它的方式實現。本文不涉及 node,所以我們主要看以下代碼

adapter=require('./adapters/xhr');

因為代碼比較多,所以這里我用圖片的形式展示一下:

pYYBAGP-sHmAU4Q7AAGPpBiaU2A722.png

到這里,我們才真正看到了熟悉的 XMLHttpRequest對象。其實axios底層也就是用的 XMLHttpRequest對象而已,沒有什么神秘的。只不過人家封裝的很好用起來方便。

其實到這里我們就已經把 axios的整體源碼分析了一次,當然還有很多細節沒有說到,比如:錯誤處理,狀態碼處理等,大家有興趣的可以自己去細讀源碼。只有自己閱讀一次才能更好的理解 axios的優雅之處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 核心
    +關注

    關注

    0

    文章

    44

    瀏覽量

    15026
  • 執行
    +關注

    關注

    0

    文章

    16

    瀏覽量

    12601
  • 配置
    +關注

    關注

    1

    文章

    188

    瀏覽量

    18375
收藏 人收藏

    評論

    相關推薦

    5G電視或成下代5G無線通信服務核心功能

    電視以及視訊內容可能會成為下一代5G無線通信服務的核心功能。..
    發表于 02-17 08:14 ?1382次閱讀

    阿里云數據庫POLARDB核心功能物理復制技術解讀

    深入解讀阿里云數據庫POLARDB核心功能物理復制技術
    發表于 06-02 10:16

    智能數字鐘的核心功能定位

    目錄前言… 2第一章 需求定義… 10產品功能定義… 10智能數字鐘的核心功能定位… 14芯片選型… 15基于成本約束的設計思路… 15CPU的選型… 15音樂芯片的選型… 16天氣預報語音播報芯片
    發表于 07-30 07:19

    F103的功能分類核心功能是什么

    文章目錄F103的功能分類核心功能:缺一不可,缺少任何一個都不能工作。重要功能:根據每一款單片機的不同,具有不同的偏重點。多為幫助內核做一些內核不能做的事情。通信功能:單片機行業成熟,
    發表于 12-10 07:33

    Bifrost GPU可編程核心的頂級布局、優勢和著色器核心功能

    本指南介紹了典型的馬里Bifrost GPU可編程核心(第三代馬里GPU)的頂級布局、優勢和著色器核心功能。Bifrost家族包括Mali-G30、Mali-G50和Mali-G70系列產品。 在
    發表于 08-02 17:52

    江智機器人人機語音交互技術核心功能點探索

    江智機器人人機語音交互技術核心功能點探索無疑機器人人機語音交互技能是人工智能機器人必須具有的核心功能點之一。國內的科大訊飛,百度等為代表的一些已在人機語音技術方面耕耘了多年,且取得了較大的發展。國內
    的頭像 發表于 03-06 14:51 ?891次閱讀
    江智機器人人機語音交互技術<b class='flag-5'>核心功能</b>點探索

    機器視覺的四大核心功能

    機器視覺的四大核心功能? 機器視覺是一種通過電子系統和計算機軟件實現人類視覺功能的技術。它運用計算機視覺、模式識別、圖像處理和機器學習等技術,以攝像機和圖像處理技術為基礎,將圖像轉化為數字信號,并
    的頭像 發表于 12-25 11:15 ?1011次閱讀

    智慧灌區平臺功能全面解析(智慧灌區場景和核心功能

    全面解析。() 一、智慧灌區平臺業務場景和核心功能 智慧灌區平臺主要業務應用于水資源規劃、相關設備監管、灌區用水計劃、耕地土壤增減方面。其核心功能包括在灌區區域部署傳感器設備對水文、土壤等信息實時采集,然后上傳到云平
    的頭像 發表于 02-22 10:27 ?630次閱讀
    智慧灌區平臺<b class='flag-5'>功能</b>全面解析(智慧灌區場景和<b class='flag-5'>核心功能</b>)

    [天拓四方]工業邊緣網關的核心功能、應用場景和實施策略

    重要支持。本文將重點介紹工業邊緣網關的核心功能、應用場景和實施策略,以展示其在工業自動化領域的專業性和實用性。 一、工業邊緣網關的核心功能 工業邊緣網關的核心功能包括: 數據采集與集成:邊緣網關能夠實時采集來自各種工業設
    的頭像 發表于 05-23 16:29 ?366次閱讀

    深度解析:藍牙網關核心功能以及應用場景

    為可通過互聯網傳輸的數據格式,從而使得遠程監控、數據分析和設備控制成為可能。 二、藍牙網關的核心功能 藍牙網關的核心功能主要圍繞以下幾個方面展開: 掃描與連接 :自動搜索并連接周圍的藍牙設備,無論是藍牙低功耗(BLE)設備還
    的頭像 發表于 07-10 10:16 ?845次閱讀
    深度解析:藍牙網關<b class='flag-5'>核心功能</b>以及應用場景

    萬界星空科技低代碼云mes核心功能詳解!建議收藏!

    云MES系統作為數字化轉型的關鍵組成部分,具有一系列核心功能和優勢,可以極大地改善制造流程管理和生產執行效率。
    的頭像 發表于 08-06 09:34 ?239次閱讀
    萬界星空科技低代碼云mes<b class='flag-5'>核心功能</b>詳解!建議收藏!

    光伏電站智能運維管理系統三大核心功能

    光伏電站智能運維管理系統三大核心功能 以往,光伏電站的運維工作需要人工巡檢和維護,不僅費時費力,而且效率低下。而隨著智能技術的發展,陜西公眾智能監測自主研發了光伏電站智能運維管理系統,為光伏電站運維
    的頭像 發表于 08-23 15:55 ?417次閱讀
    光伏電站智能運維管理系統三大<b class='flag-5'>核心功能</b>

    PCS儲能變流器工作原理與核心功能

    PCS儲能變流器是一種雙向電流可控轉換裝置,它能夠連接儲能電池系統與電網或負荷。這種裝置的核心功能是控制儲能電池的充電和放電過程,實現交直流電能的變換。在無電網情況下,PCS儲能變流器甚至可以直接為
    的頭像 發表于 09-17 17:03 ?964次閱讀

    工業物聯網盒子核心功能與技術特點

    將這些數據上傳至云端或本地服務器進行分析處理。工業物聯網盒子不僅是數據采集的前端,也是實現設備遠程監控、預測性維護、能效優化等高級應用的基礎。 一、核心功能與技術特點 工業物聯網盒子的核心功能與技術特點,使其能
    的頭像 發表于 11-22 17:21 ?204次閱讀

    Monitor Wafer的核心功能、特點、生產流程和應用

    制造中扮演著至關重要的角色。它并不直接用于最終產品的制造,而是作為一種過程監控工具,用于實時或周期性地“診斷”設備和工藝的健康狀況,確保整個生產流程的穩定性和可靠性。 一、Monitor Wafer的核心功能
    的頭像 發表于 12-06 10:59 ?296次閱讀
    主站蜘蛛池模板: 暖暖 免费 高清 日本视频大全| 欧美日韩高清一区| 欧美巨大xxxx做受孕妇视频| 日韩视频中文字幕精品偷拍| 亚洲精品卡2卡3卡4卡5卡区| 99re10久久热| 国产亚洲精品网站在线视频 | 黄页网站免费视频大全9| 牛牛自拍国产免费视频| 无码专区久久综合久综合字幕| 制服丝袜第一页| 国产精品97久久AV麻豆| 伦理片在线线看手机版| 午夜免费国产体验区免费的| 3DNagoonimation动漫| 国产九九熟女在线视频| 免费网站在线观看国产v片| 亚洲爆乳无码精品AAA片蜜桃| 99久久免费精品| 寂寞骚妇女被后入式抽插| 日韩精品特黄毛片免费看| 长篇高h肉爽文丝袜| 国产乱国产乱老熟300部视频| 欧美高清video mr.sexo| 亚洲欧美精品无码大片在线观看| 超碰人人草在线视频| 久久性色AV亚洲电影无码| 午夜伦4480yy妇女久久| JEALOUSVUE成熟老师APP| 久久久久久九九| 亚洲国产在线播放在线| 电影 qvod| 欧美 日韩 无码 有码 在线| 又黄又粗又爽免费观看| 国产女人喷潮视频免费| 日韩插啊免费视频在线观看| 67194线在线精品观看| 久久99re2在线视频精品| 香蕉97超级碰碰碰碰碰久| 穿白丝袜边走边尿白丝袜| 老女人与小伙子露脸对白|