前端JavaScript異步請求的兩種方式詳解
一、XMLHttpRequest(XHR)方式
早期的前端異步請求主要依賴于 XMLHttpRequest 對象。它允許 JavaScript 以異步方式與服務(wù)器進(jìn)行數(shù)據(jù)交換,而無需重新加載整個頁面。
代碼示例
const getJSON = async url => {
return new Promise((resolve, reject) => {
// executor 執(zhí)行器
// 開始處于pending狀態(tài)
const xhr = new XMLHttpRequest(); // 實(shí)例化
xhr.open("GET", "https://api.github.com/users/LeeAt67/repos");
console.log(xhr.readyState);
xhr.send(); // 發(fā)送請求
// 事件監(jiān)聽 回調(diào)函數(shù)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
// 響應(yīng)內(nèi)容到達(dá)了
resolve(JSON.parse(xhr.responseText));
}
};
});
};
邏輯說明
- 實(shí)例化 XHR 對象:通過
new XMLHttpRequest()創(chuàng)建請求對象。 - 打開請求通道:
xhr.open("GET", url)指定請求方式和目標(biāo)地址。 - 發(fā)送請求:
xhr.send()向服務(wù)器發(fā)送請求。 - 監(jiān)聽狀態(tài)變化:通過
xhr.onreadystatechange監(jiān)聽請求狀態(tài)的變化。當(dāng)readyState為 4 時,表示響應(yīng)內(nèi)容已經(jīng)到達(dá),可以通過xhr.responseText獲取數(shù)據(jù)。 - Promise 封裝:將 XHR 封裝在 Promise 中,使其支持
async/await,更符合現(xiàn)代 JavaScript 的異步編程習(xí)慣。
頁面渲染
請求到的數(shù)據(jù)會被渲染到頁面的 <ul id="repos"></ul> 元素中:
document.getElementById("repos").innerHTML = data
.map(item => `<li>${item.name}</li>`)
.join("");
二、Fetch 方式
隨著 ES6+ 的普及,fetch API 成為更現(xiàn)代、更簡潔的異步請求方式。它本質(zhì)上返回一個 Promise 實(shí)例,天然支持 async/await。
代碼示例
document.addEventListener("DOMContentLoaded", async () => {
const result = await fetch("https://api.github.com/users/LeeAt67/repos");
const data = await result.json();
document.getElementById("repos").innerHTML = data
.map(item => `<li>${item.name}</li>`)
.join("");
});
邏輯說明
- 頁面加載完成后執(zhí)行:通過
DOMContentLoaded事件,確保 DOM 元素已加載。 - 發(fā)起請求:
fetch(url)直接發(fā)起請求,返回 Promise。 - 解析數(shù)據(jù):
await result.json()將響應(yīng)體解析為 JSON 數(shù)據(jù)。 - 渲染頁面:同樣將數(shù)據(jù)渲染到
<ul id="repos"></ul>。
優(yōu)勢
- 語法更簡潔,鏈?zhǔn)秸{(diào)用更自然。
- 支持更豐富的配置和更好的語義化。
- 天然支持 Promise,易于與
async/await配合。
三、對比與總結(jié)
| 特性 | XMLHttpRequest | fetch |
|---|---|---|
| 語法 | 相對繁瑣,需要事件監(jiān)聽 | 簡潔,Promise 化 |
| 支持 | 兼容性好,老項(xiàng)目常用 | 現(xiàn)代瀏覽器原生支持 |
| 返回值 | 無 Promise,需手動封裝 | 返回 Promise,支持 async/await |
| 錯誤處理 | 需手動判斷狀態(tài)碼 | 可直接用 try/catch |
結(jié)論
- XHR 適合需要兼容老瀏覽器或維護(hù)老項(xiàng)目時使用。
- fetch 更適合現(xiàn)代前端開發(fā),推薦優(yōu)先使用。
到此這篇關(guān)于前端JavaScript異步請求的兩種方式詳解的文章就介紹到這了,更多相關(guān)JavaScript異步請求方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用contextMenu插件實(shí)現(xiàn)Bootstrap table彈出右鍵菜單
如今Bootstrap這個前端框架已被許多人接受并應(yīng)用在不同的項(xiàng)目中,其中“開發(fā)高效,設(shè)備兼容”的特點(diǎn)表現(xiàn)得非常明顯。這篇文章主要介紹了使用contextMenu插件實(shí)現(xiàn)Bootstrap table彈出右鍵菜單,需要的朋友可以參考下2017-02-02
手機(jī)平板等移動端適配跳轉(zhuǎn)URL的js代碼
這篇文章主要為大家分享下手機(jī)平板等移動端適配跳轉(zhuǎn)URL的js代碼,需要的朋友可以參考下2014-01-01
bootstrap中添加額外的圖標(biāo)實(shí)例代碼
可以針對校驗(yàn)狀態(tài)為輸入框添加額外的圖標(biāo)。接下來通過本文給大家分享bootstrap中添加額外的圖標(biāo)實(shí)例代碼,需要的的朋友參考下吧2017-02-02
JavaScript中的各種寬高屬性的實(shí)現(xiàn)
這篇文章主要介紹了JavaScript中的各種寬高屬性的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

