關(guān)于Ajax的封裝詳解
Ajax的封裝
一個(gè)免費(fèi)的測(cè)試接口
https://api.apiopen.top/getJoke
一、最簡(jiǎn)單的原生Ajax封裝
- 先看下效果

- 具體代碼
<body>
<div class="box">
<button id="btn">來段數(shù)據(jù)</button><br>
<textarea id="text" ></textarea>
</div>
<script>
const btn = document.getElementById("btn");
const txt = document.getElementById("text");
btn.onclick = function(){
getAjax('get','https://api.apiopen.top/getJoke',function(res){
let narr=[];
for(let i=0;i<res.length;i++){
narr.push('\n'+(i+1)+'.'+res[i].text)
console.log(res[i].text);
text.innerHTML=narr;
}
});
}
function getAjax(method,url,callback){
const xhr = new XMLHttpRequest();
xhr.open(method,url);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhr.status>=200 && xhr.status<300){
const res = JSON.parse(xhr.response);
callback(res.result);
}
}
}
}
</script>二、使用promise函數(shù)封裝
Promise是ES6引入的異步編程的新解決方案,語法上Promise是一個(gè)構(gòu)造函數(shù),用來封裝異步操作并可以獲取其成功或者失敗的回調(diào)結(jié)果。
- 通過promise實(shí)例化的對(duì)象可以接受一個(gè)參數(shù),參數(shù)類型為函數(shù),該函數(shù)的兩個(gè)參數(shù)是resolve和reject,
- 在請(qǐng)求到數(shù)據(jù)后可以通過resolve、resolve函數(shù)來改變Promise對(duì)象的狀態(tài)
- resolve表示成功,resolve表示失敗
- 成功或者失敗都可以調(diào)用Promise對(duì)象的then方法
- then接收兩個(gè)參數(shù),兩個(gè)參數(shù)都是函數(shù)類型
- 成功的形參為value,失敗的形參為reason
- value就是resolve方法里的返回結(jié)果
<script>
const btn = document.getElementById("btn");
btn.onclick = function(){
grtAjax('get','https://api.apiopen.top/getJoke',function(res){
console.log(res);
});
}
function grtAjax(method,url,callback){
const p = new Promise((resolve,reject)=>{
const xhr = new XMLHttpRequest();
xhr.open(method,url);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status >= 200 && xhr.status < 300){
resolve(xhr.response);
}else{
reject(xhr.status);
}
}
}
});
p.then(function(value){
const res = JSON.parse(value);
callback(res.result)
},function(reason){
console.error(reason);
})
}
</script>
三、promise配合async和await使用
async
- async和await兩種語法結(jié)合可以讓異步代碼像同步代碼一樣
- async函數(shù)的返回值為promise對(duì)象
- 該promise對(duì)象的結(jié)果是由async函數(shù)執(zhí)行的返回值決定的
- 只要返回值的類型不是一個(gè)promise類型的對(duì)象則async函數(shù)的返回結(jié)果就是一個(gè)成功的promise對(duì)象
- 返回值的類型不是一個(gè)promise類型的對(duì)象則跟promise對(duì)象的狀態(tài)有關(guān)revolve或者reject或者拋出異常
await
- await右側(cè)的表達(dá)式一般為promise對(duì)象,但也可以是其他的值
- 如果是promise對(duì)象,await返回的是promise成功的值
- 如果是其他的值,直接將此值作為await的返回值
- await必須寫在async函數(shù)中,但是async函數(shù)中可以沒有await
- 如果await的promise狀態(tài)是失敗的,就會(huì)拋出異常,需要通過try…catch捕獲處理

<body>
<button>請(qǐng)求數(shù)據(jù)</button>
<script>
const btn = document.querySelector('button');
function sendAjax(method,url){
return new Promise((resolve,reject)=>{
const xhr = new XMLHttpRequest();
xhr.responseType = 'json';
xhr.open(method,url);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhr.status >=200 && xhr.status<300){
resolve(xhr.response);
}else{
reject(xhr.status);
}
}
}
})
}
btn.addEventListener('click',async function(){
let result = await sendAjax('get','https://api.apiopen.top/getJoke');
console.log(result);
})
</script>
</body>四、使用axios工具庫直接發(fā)送Ajax
Axios 是一個(gè)基于 promise 網(wǎng)絡(luò)請(qǐng)求庫,作用于node.js 和瀏覽器中。 它是 isomorphic 的(即同一套代碼可以運(yùn)行在瀏覽器和node.js中)。在服務(wù)端它使用原生 node.js http 模塊, 而在客戶端 (瀏覽端) 則使用 XMLHttpRequests。
- 這里使用了vue-cli搭建了一個(gè)vue項(xiàng)目并下載了 axios
post

get

<template>
<div>
<button @click="post">直接發(fā)送POST</button>
<button @click="get">直接發(fā)送GET</button>
</div>
</template>
<script>
export default {
data(){
return{}
},
methods:{
async get(){
const {data:res} = await this.$axios.get('https://api.apiopen.top/getJoke',{
params:{id:1}
});
console.log(res);
},
post(){
this.$axios.post('https://api.apiopen.top/getJoke',{name:'yxj',gender:'男'})
.then((res)=>{
console.log(res.data.result);
});
}
}
}
</script>到此這篇關(guān)于關(guān)于Ajax的封裝詳解的文章就介紹到這了,更多相關(guān)Ajax的封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ajax異步請(qǐng)求的五個(gè)步驟及實(shí)戰(zhàn)案例
通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax可以使網(wǎng)頁實(shí)現(xiàn)異步更新,下面這篇文章主要給大家介紹了關(guān)于Ajax異步請(qǐng)求的五個(gè)步驟及實(shí)戰(zhàn)案例的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
AJAX和JSP實(shí)現(xiàn)的基于WEB的文件上傳的進(jìn)度控制代碼
AJAX和JSP實(shí)現(xiàn)的基于WEB的文件上傳的進(jìn)度控制代碼...2007-05-05
ajax實(shí)時(shí)任務(wù)提示功能的實(shí)現(xiàn)代碼
本項(xiàng)目運(yùn)用了 FLEAPHP,MYSQL,SMARTY,FCKEDItor,JSON,PROTOTYPE的技術(shù),在這里首先要感謝這些開源項(xiàng)目的開發(fā)者給我們帶來的好東西,其次要感謝[生氣豬--讓我?guī)退鲆粋€(gè)這樣的小東西來提醒她按時(shí)完成事情].花了一個(gè)3個(gè)小時(shí)完成.希望給大家起到拋磚引玉的作用啊....2008-09-09
Ajax?請(qǐng)求隊(duì)列解決方案并結(jié)合elementUi做全局加載狀態(tài)
這篇文章主要介紹了Ajax?請(qǐng)求隊(duì)列解決方案并結(jié)合elementUi做全局加載狀態(tài),使用 消息隊(duì)列 制作 請(qǐng)求防抖,防止重復(fù)請(qǐng)求印象服務(wù)器,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
AJAX亂碼與異步同步以及封裝jQuery庫實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了異步通信技術(shù)AJAX亂碼問題、異步與同步、手動(dòng)封裝一個(gè)jQuery庫,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
利用AJAX實(shí)現(xiàn)無刷新數(shù)據(jù)分頁
這篇文章主要介紹了利用AJAX實(shí)現(xiàn)數(shù)據(jù)分頁的相關(guān)資料,如何利用AJAX無刷新直接從服務(wù)器獲取數(shù)據(jù)分頁,感興趣的小伙伴們可以參考一下2016-04-04

