Axios中的取消請求原始碼解析

2022-09-02 10:12:08 字數 2685 閱讀 1185

前言

在開發中,為了活動動態資料,因此我們需要與後台通過請求進行互動,獲取動態資料來展現給使用者看。有些一些**對實時資訊要求還更高,比如**類、聊天類、直播類等。本章內容涉及思想層面東西比較多,如果出現知識盲點無所謂,主要就是體會promise的運用思想!思想!思想!(小白也可以試試)

當下流行的http庫

它在github上的star數截至到2023年3月已經達到70.2k,這算是比較多的了

今天講什麼

取消請求

先說一下,有時我們上傳乙個檔案到伺服器的時候,檔案很大,不可能一下傳完,但是我們中途發現檔案錯了,因此我們點選取消,即為:取消請求。

在axios中的**如下:

// 建立取消令牌的生成器物件

const canceltoken = axios.canceltoken;

// 從中獲取令牌物件

const source = canceltoken.source();

// 發請求

axios.get('/user/12345', );

// 2秒取消請求

settimeout(function () ,2000);

雖然注釋已經打上了,中文意思大家都懂,但是很少有人能知道這其中promise做了啥,而相反我們更容易理解為cancel函式中斷了非同步請求,是中斷了promise嗎? 不是!

原始碼實現

接下來我帶大家簡單實現乙個,你可能就清楚了。

為了便於理解,我少封裝了一層,針對上述const source = canceltoken.source();

我寫了如下**,看起來差不多

var source = source();
接著模擬axios.get(url,options); 函式,我也簡單的這麼寫

axios_get('url',);
最後我們做定時器

settimeout(function () ,5000)
好了,需要呼叫的**都寫好了,接下來就是就是實現這些函式,首先我應該有個source函式,他返回乙個物件,可以呼叫cancel函式,有個token屬性

function source () 

}

ok,接下來我們還有axios_get函式,他的作用就是發請求,假設我們使用xmlhttprequest物件,他裡面則最終經過配置後需要發請求。

function axios_get(url,options)
以上**這個思路沒問題吧?

接著來!使用者點選後,通過呼叫source.cancel() 實際需要訪問到axios_get內部的xmlhttprequest物件,呼叫其的abort函式才能真正意義的取消。因此,我們要想辦法讓source某一部分能訪問到該物件。這裡唯一的觸及點就是傳遞的canceltoken:source.token。

function axios_get(url,options) 

// 最終發請求

xhr.request();

}

這裡你可以想到直接呼叫函式,或者回傳xhr.abort等方式,但是由於axios是基於promise的,因此,我們最好用promise來處理,顯得也會更優雅,我們假設這個canceltoken就是promise,那麼給他定義.then的話,中間就只差乙個resolve(),該函式就能得到執行了

function axios_get(url,options) );

}// 最終發請求

xhr.request();

}

好了,繼續往上追溯,這裡的canceltoken也就是我們source.token,他要是個promise的話,我們就得回到之前的建立source函式中

function source () );

return

}

好像還有點不對,我們應該把鏈結promise和then的乙個放行開關傳遞出去,這樣才能呼叫resolve執行後續的.then從而執行取消請求的**

function source () );

return

}

好了,至此,我們在source裡面建立promise,將其本身和resolve(cancel) 向外匯出,在請求的時候傳遞給axios_get函式,其內部配置promise的.then:取消請求。

如圖就是這個思想,主要就是我們利用了promise 和 其 resolve 來放行到下一步,進行延遲執行。

完整**:

// 建立promise,返回放行開關cancel

function source () );

return

} // 發請求

function axios_get(config) )

}}// **執行

var source = source();

axios_get();

settimeout(function () ,5000)

axios中的取消請求

在axios文件中介紹的又兩個取消請求的方法 1 使用 canceltoken.source 工廠方法建立 cancel token,如下 var canceltoken axios.canceltoken var source canceltoken.source axios.get user 1...

一比一還原axios原始碼(七) 取消功能

按照慣例,我們先來看下官方的例子 你可以通過axios的canceltoken工廠函式,生成乙個source,然後把這個物件作為引數傳遞給axios,最後,需要取消的時候呼叫source的cancel方法即可。你還可以通過在引數中繫結new canceltoken的引數中的 來賦值執行取消操作。最後...

axios中的post請求

axios是乙個基於promise用於瀏覽器和node.js的http客戶端。axios常用的api有4個,實際上對應著http請求的4種方式。這裡重點說一下get傳遞引數的方式 大方向分為兩種 1 url形式 2 通過params屬性傳遞引數 url傳遞引數也有兩種方式 1 傳統形式的url 在路...