中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

做個(gè)簡(jiǎn)單網(wǎng)站大概多少錢中文搜索引擎有哪些平臺(tái)

做個(gè)簡(jiǎn)單網(wǎng)站大概多少錢,中文搜索引擎有哪些平臺(tái),臺(tái)州網(wǎng)站建設(shè)設(shè)計(jì),dw做視頻網(wǎng)站Axios Axios是一個(gè)基于Promise的HTTP庫(kù),可以發(fā)送get、post等請(qǐng)求,它作用于瀏覽器和Node.js中。當(dāng)運(yùn)行在瀏覽器時(shí),使用XMLHttpRequest接口發(fā)送請(qǐng)求;當(dāng)運(yùn)行在Node.js時(shí),使用HTTP對(duì)象發(fā)送請(qǐng)求。 使用步驟: 第…

Axios

Axios是一個(gè)基于PromiseHTTP庫(kù),可以發(fā)送get、post等請(qǐng)求,它作用于瀏覽器Node.js中。當(dāng)運(yùn)行在瀏覽器時(shí),使用XMLHttpRequest接口發(fā)送請(qǐng)求;當(dāng)運(yùn)行在Node.js時(shí),使用HTTP對(duì)象發(fā)送請(qǐng)求。

使用步驟:

? 第一步:安裝axios? 略

第二步:在項(xiàng)目中使用Axios時(shí),通常的做法是先將Axios封裝成一個(gè)模塊,然后在組件中導(dǎo)入模塊。

第三步:編寫各種請(qǐng)求?這里只說(shuō)明 基本的get請(qǐng)求post請(qǐng)求。

request({url: '請(qǐng)求路徑',method: 'get',params: { 參數(shù) }
}).then(res => {console.log(res)
}).catch(error => {console.log(error)
})

get請(qǐng)求:

/*** 發(fā)送GET請(qǐng)求*/
export const getReq = (url, params) => {return axios({method: 'get',params, // 使用params而非dataurl: `${base}${url}`,headers: {'token': localStorage.getItem("token"),}});
}

?使用它:

// 獲取用戶列表,帶分頁(yè)參數(shù)
getReq('/api/users', { page: 1, pageSize: 10 }).then(res => {console.log('用戶列表:', res.data);}).catch(err => {console.error('請(qǐng)求失敗:', err);});

?post請(qǐng)求:

request({url: '請(qǐng)求路徑',method: 'post',data: { 參數(shù) }
}).then(res => {console.log(res)
}).catch(error => {console.log(error)
})

export const postReq = (url, params) => {return axios({method: 'post',url: `${base}${url}`,data: params,headers: {'token': localStorage.getItem("token"),}});

??

?異步請(qǐng)求調(diào)用中?async+await 的應(yīng)用

代碼:

export const fetchData = async (url, params) => {try {const response = await axios({method: 'get',params, // 修正:使用 params 而非 dataurl: `${base}${url}`,headers: {'token': localStorage.getItem('token'),}});return response.data;} catch (error) {console.error('請(qǐng)求失敗:', error);throw error; // 修正:重新拋出錯(cuò)誤,讓調(diào)用者處理}
};

?async+await 的概念

async/await 是一種建立在Promise之上的編寫異步或非阻塞代碼的新方法。async 是異步的意思,而 await 是 async wait的簡(jiǎn)寫,即異步等待。

所以從語(yǔ)義上就很好理解 async 用于聲明一個(gè) 函數(shù) 是異步的,而await 用于等待一個(gè)異步方法執(zhí)行完成。

那么想要同步使用數(shù)據(jù)的話,就可以使用 async+await 。

?說(shuō)明:async函數(shù)返回的是一個(gè) Promise 對(duì)象。async 函數(shù)(包含函數(shù)語(yǔ)句、函數(shù)表達(dá)式、Lambda表達(dá)式)會(huì)返回一個(gè) Promise 對(duì)象,如果在函數(shù)中 ?一個(gè)直接量,async 會(huì)把這個(gè)直接量通過(guò)promise.solve() 封裝成 Promise 對(duì)象。

如果 async 函數(shù)沒(méi)有返回值, 它會(huì)返回 promise.solve(underfined)。

await 等待的是一個(gè)表達(dá)式,這個(gè)表達(dá)式的計(jì)算結(jié)果是 Promise 對(duì)象或者其它值(換句話說(shuō),await 可以等任意表達(dá)式的結(jié)果)。

如果它等到的不是一個(gè) Promise 對(duì)象,那 await 表達(dá)式的運(yùn)算結(jié)果就是它等到的東西。

如果它等到的是一個(gè) Promise 對(duì)象,await 就忙起來(lái)了,它會(huì)阻塞后面的代碼,等著 Promise 對(duì)象 resolve,然后得到 resolve 的值,作為 await 表達(dá)式的運(yùn)算結(jié)果。

調(diào)用方式:

Promise 鏈?zhǔn)秸{(diào)用:.then().catch() 同步風(fēng)格的

await:在 async 函數(shù)內(nèi)部使用

  • romise 鏈?zhǔn)秸{(diào)用適合 “非阻塞、并行、兼容舊環(huán)境” 的場(chǎng)景,強(qiáng)調(diào)異步操作的獨(dú)立性。
  • async/await適合 “順序依賴、復(fù)雜流程、高可讀性” 的場(chǎng)景,讓異步代碼更接近同步思維模式。
1. 使用?.then()?和?.catch()?鏈?zhǔn)秸{(diào)用
import { fetchData } from './api'; // 假設(shè)從 api.js 導(dǎo)入// 調(diào)用 fetchData 獲取用戶列表
fetchData('/api/users', { page: 1, pageSize: 10 }).then(data => {console.log('用戶列表:', data);// 處理返回的數(shù)據(jù)(如更新組件狀態(tài))}).catch(error => {console.error('請(qǐng)求失敗:', error);// 顯示錯(cuò)誤消息(如彈框提示)});
//其他邏輯會(huì)和fetchData同步進(jìn)行
.....  

2. 在?async?函數(shù)內(nèi)部使用?await

async function loadUsers() {try {// 等待請(qǐng)求完成并獲取數(shù)據(jù)const data = await fetchData('/api/users', { page: 1, pageSize: 10 });console.log('用戶列表:', data);// 可以直接使用同步風(fēng)格的代碼處理數(shù)據(jù)const firstUser = data.list[0];console.log('第一個(gè)用戶:', firstUser);} catch (error) {console.error('請(qǐng)求失敗:', error);// 錯(cuò)誤處理邏輯}
}// 調(diào)用 async 函數(shù)
loadUsers();

當(dāng)執(zhí)行?loadUsers()?函數(shù)時(shí),它會(huì)返回一個(gè)?Promise 對(duì)象,并且其內(nèi)部邏輯會(huì)以異步方式執(zhí)行。以下是詳細(xì)解釋:

1. 函數(shù)返回值:Promise 對(duì)象
  • 原因:任何使用?async?關(guān)鍵字聲明的函數(shù)都會(huì)自動(dòng)返回一個(gè) Promise。

  • 示例驗(yàn)證

    javascript

    const result = loadUsers();
    console.log(result instanceof Promise); // 輸出: true
    
  • Promise 的狀態(tài)

    • 成功(fulfilled):當(dāng)?fetchData?請(qǐng)求成功且沒(méi)有拋出異常時(shí),Promise 會(huì) resolve,并傳遞?loadUsers?函數(shù)的返回值(若沒(méi)有顯式返回,默認(rèn)返回?undefined)。
    • 失敗(rejected):當(dāng)?fetchData?拋出異常,或?loadUsers?內(nèi)部?try?塊中的代碼報(bào)錯(cuò)時(shí),Promise 會(huì) reject,并傳遞錯(cuò)誤對(duì)象。
2. 函數(shù)執(zhí)行流程(異步本質(zhì))

javascript

console.log('開始執(zhí)行');
loadUsers();
console.log('結(jié)束執(zhí)行');// 輸出順序:
// 開始執(zhí)行
// 結(jié)束執(zhí)行
// (等待 fetchData 請(qǐng)求完成后)
// 用戶列表: ...
// 第一個(gè)用戶: ...

  • 關(guān)鍵特點(diǎn)
    1. loadUsers()?函數(shù)被調(diào)用后立即返回 Promise,不會(huì)阻塞后續(xù)代碼執(zhí)行。
    2. await fetchData(...)?僅暫停函數(shù)內(nèi)部的執(zhí)行,不會(huì)影響外部代碼(如?console.log('結(jié)束執(zhí)行')?會(huì)先于?fetchData?的結(jié)果輸出)。
    3. 當(dāng)?fetchData?的 Promise 解決(成功 / 失敗)時(shí),loadUsers?內(nèi)部的?await?會(huì)恢復(fù)執(zhí)行,并決定 Promise 的最終狀態(tài)。
3. Promise 的解決(resolve)情況

當(dāng)?fetchData?請(qǐng)求成功且?try?塊內(nèi)代碼無(wú)異常時(shí):

  • loadUsers?的 Promise 會(huì) resolve,返回值為?undefined(因?yàn)楹瘮?shù)沒(méi)有顯式?return)。

  • 等價(jià)于:

    javascript

    async function loadUsers() {// ... 代碼 ...return undefined; // 隱式返回
    }
    
  • 可通過(guò)?.then()?捕獲結(jié)果

    javascript

    loadUsers().then(result => {console.log('loadUsers 返回值:', result); // 輸出: undefined
    });
    
4. Promise 的拒絕(reject)情況

當(dāng)出現(xiàn)以下情況時(shí),loadUsers?的 Promise 會(huì) reject:

  1. fetchData?拋出錯(cuò)誤

    javascript

    fetchData('/api/users', { page: 1 }).catch(error => {throw new Error('請(qǐng)求失敗: ' + error); // 被 loadUsers 的 catch 捕獲});
    
  2. try?塊內(nèi)其他代碼報(bào)錯(cuò)

    javascript

    const firstUser = data.list[0]; // 若 data.list 為 undefined,會(huì)拋出 TypeError
    
  3. catch?塊中重新拋出錯(cuò)誤

    javascript

    catch (error) {console.error('請(qǐng)求失敗:', error);throw error; // 重新拋出,導(dǎo)致 Promise reject
    }
    

  • 可通過(guò)?.catch()?捕獲錯(cuò)誤

    javascript

    loadUsers().catch(error => {console.error('loadUsers 錯(cuò)誤:', error);
    });
    
5. 與 Promise 鏈?zhǔn)秸{(diào)用的等價(jià)關(guān)系

loadUsers?函數(shù)的異步邏輯等價(jià)于以下 Promise 寫法:

javascript

function loadUsers() {return fetchData('/api/users', { page: 1, pageSize: 10 }).then(data => {console.log('用戶列表:', data);const firstUser = data.list[0];console.log('第一個(gè)用戶:', firstUser);// 隱式返回 undefined}).catch(error => {console.error('請(qǐng)求失敗:', error);throw error; // 重新拋出錯(cuò)誤,保持 Promise 鏈的異常傳遞});
}
6. 如何獲取函數(shù)的執(zhí)行結(jié)果?
(1)使用?.then()

javascript

loadUsers().then(() => {console.log('數(shù)據(jù)處理完成');}).catch(error => {console.error('處理失敗:', error);});
(2)在另一個(gè)?async?函數(shù)中使用?await

javascript

async function processData() {try {await loadUsers(); // 等待 loadUsers 的 Promise 解決console.log('loadUsers 執(zhí)行完畢');} catch (error) {console.error('processData 捕獲到錯(cuò)誤:', error);}
}

  • 返回值loadUsers()?始終返回一個(gè) Promise 對(duì)象。
  • 狀態(tài)由內(nèi)部邏輯決定
    • 成功時(shí)(fetchData?正常返回且無(wú)代碼錯(cuò)誤):Promise resolve,返回?undefined。
    • 失敗時(shí)(fetchData?報(bào)錯(cuò)或代碼異常):Promise reject,傳遞錯(cuò)誤對(duì)象。
  • 異步本質(zhì):函數(shù)內(nèi)部使用?await?暫僅停自身執(zhí)行,不阻塞主線程,整體仍為異步操作。

應(yīng)用transformRequest

export const postRequest = (url, params) => {return axios({method: 'post',url: `${base}${url}`,data: params,transformRequest: [function (data) {let ret = '';for (let key in data) {ret += encodeURIComponent(key) + '=' + encodeURIComponent(data[key]) + '&';}return ret;}],headers: {'Content-Type': 'application/x-www-form-urlencoded', // 修正為表單格式}});
}

說(shuō)明:

  1. 數(shù)據(jù)格式與請(qǐng)求頭的關(guān)系

    • application/json:請(qǐng)求體應(yīng)為 JSON 格式(如{"key": "value"})。
    • application/x-www-form-urlencoded:請(qǐng)求體應(yīng)為表單格式(如key=value&key2=value2)。
  2. transformRequest的影響

    • 當(dāng)前代碼將對(duì)象轉(zhuǎn)換為表單格式數(shù)據(jù),但請(qǐng)求頭卻聲明為 JSON,導(dǎo)致后端可能無(wú)法解析。
    • 若后端期望 JSON 數(shù)據(jù),應(yīng)移除transformRequest并保持application/json頭。
  3. 正確的搭配方式

    數(shù)據(jù)格式Content-Type是否需要 transformRequest
    JSONapplication/json不需要
    表單數(shù)據(jù)application/x-www-form-urlencoded需要(如當(dāng)前函數(shù))
    二進(jìn)制文件 / 表單multipart/form-data不需要

函數(shù)調(diào)用示例

場(chǎng)景 1:提交表單數(shù)據(jù)到后端

import { postRequest } from './api.js'; // 導(dǎo)入函數(shù)// 表單數(shù)據(jù)
const formData = {username: 'test_user',password: '123456',email: 'test@example.com'
};// 調(diào)用函數(shù)
postRequest('/api/register', formData).then(response => {console.log('注冊(cè)成功:', response.data);}).catch(error => {console.error('注冊(cè)失敗:', error);});
場(chǎng)景 2:發(fā)送 JSON 數(shù)據(jù)(需修改函數(shù))

如果需要發(fā)送 JSON 數(shù)據(jù),應(yīng)使用以下封裝:

export const postJsonRequest = (url, params) => {return axios({method: 'post',url: `${base}${url}`,data: params,headers: {'Content-Type': 'application/json',}});
}// 調(diào)用示例
const userData = {name: '張三',age: 25,hobbies: ['閱讀', '編程']
};postJsonRequest('/api/users', userData).then(res => console.log(res.data));

調(diào)用注意事項(xiàng)

  1. 參數(shù)說(shuō)明

    • url:API 路徑(如/api/login),會(huì)自動(dòng)拼接base(如http://localhost:8080)。
    • params:需要發(fā)送的數(shù)據(jù)對(duì)象,會(huì)被transformRequest轉(zhuǎn)換為表單格式。
  2. 錯(cuò)誤處理

    • 在調(diào)用時(shí)添加.catch()處理請(qǐng)求失敗:

      postRequest(...).catch(error => {const status = error.response?.status || '網(wǎng)絡(luò)錯(cuò)誤';const message = error.response?.data?.message || '請(qǐng)求失敗';console.error(`狀態(tài)碼 ${status}: ${message}`);
      });
      
  3. 與其他請(qǐng)求函數(shù)的區(qū)別

    • 若后端接口需要不同的 Content-Type,應(yīng)創(chuàng)建不同的封裝函數(shù)(如 JSON 格式、文件上傳等)。

  1. 數(shù)據(jù)為對(duì)象格式(如{key: value}
  2. 后端接口期望表單數(shù)據(jù)(application/x-www-form-urlencoded
  3. 添加錯(cuò)誤處理邏輯以應(yīng)對(duì)請(qǐng)求失敗的情況

如果需要發(fā)送 JSON 數(shù)據(jù),最好創(chuàng)建專門的函數(shù),不需要transformRequest。

對(duì)不同格式的數(shù)據(jù),spring boot 端的處理:

場(chǎng)景推薦注解示例
處理 JSON 數(shù)據(jù)@RequestBody@RequestBody User user
處理簡(jiǎn)單表單數(shù)據(jù)(少量參數(shù))@RequestParam@RequestParam("username") String name
處理復(fù)雜表單數(shù)據(jù)(對(duì)象綁定)@ModelAttribute@ModelAttribute User user
同時(shí)支持 JSON 和表單(需自定義)@RequestBody?+ 轉(zhuǎn)換器配置?FormHttpMessageConverter

建議:

  • JSON:統(tǒng)一使用?@RequestBody,前端發(fā)送?application/json
  • 表單:使用?@RequestParam?或?@ModelAttribute,前端發(fā)送?application/x-www-form-urlencoded。
  • 避免混用:不要試圖用?@RequestBody?同時(shí)處理兩種格式,會(huì)增加復(fù)雜度。

postJsonRequest?

export const postJsonRequest = (url, params) => {return axios({method: 'post',url: `${base}${url}`,data: params,  // axios 自動(dòng)將對(duì)象序列化為 JSONheaders: {'Content-Type': 'application/json',}});
}

?調(diào)用方式例子:

// 發(fā)送用戶數(shù)據(jù)
const userData = {username: 'john',email: 'john@example.com',isActive: true
};postJsonRequest('/api/users', userData).then(res => console.log('用戶創(chuàng)建成功:', res.data)).catch(err => console.error('錯(cuò)誤:', err));

發(fā)送表單數(shù)據(jù)(application/x-www-form-urlencoded)

export const postFormRequest = (url, params) => {return axios({method: 'post',url: `${base}${url}`,data: params,transformRequest: [function (data) {let ret = '';for (let key in data) {ret += encodeURIComponent(key) + '=' + encodeURIComponent(data[key]) + '&';}return ret;}],headers: {'Content-Type': 'application/x-www-form-urlencoded',}});
}

??調(diào)用方式例子:

// 提交登錄表單
const loginData = {username: 'admin',password: '123456',rememberMe: true
};postFormRequest('/api/login', loginData).then(res => {localStorage.setItem('token', res.data.token);console.log('登錄成功');}).catch(err => alert('登錄失敗: ' + err.message));

比與適用場(chǎng)景及編碼問(wèn)題

方案Content-Type數(shù)據(jù)格式后端適配前端寫法
方案一(JSON)application/json{"key":"value"}Spring Boot 的?@RequestBody直接傳遞對(duì)象
方案二(表單)application/x-www-form-urlencodedkey=value&key2=value2Spring Boot 的?@RequestParam/@ModelAttribute需手動(dòng)或用庫(kù)序列化
  1. 后端接口匹配

    • JSON 格式:確保后端使用?@RequestBody?注解
    • 表單格式:確保后端使用?@RequestParam?或?@ModelAttribute
  2. 編碼問(wèn)題

    • 表單數(shù)據(jù)中的特殊字符(如中文)會(huì)被?encodeURIComponent?自動(dòng)編碼
    • JSON 數(shù)據(jù)中的中文會(huì)被序列化為 Unicode 字符(如?\u4e2d

putRequest :

export const putRequest = (url, params) => {return axios({method: 'put',url: `${base}${url}`,data: params,transformRequest: [function (data) {if (!data) return '';const ret = [];for (let key in data) {if (data.hasOwnProperty(key)) {const value = data[key];// 處理值為 null 或 undefined 的情況const encodedValue = value === null || value === undefined ? '' : encodeURIComponent(value);ret.push(`${encodeURIComponent(key)}=${encodedValue}`);}}// 使用 join 避免末尾多余的 &return ret.join('&');}],headers: {'Content-Type': 'application/x-www-form-urlencoded'}}).catch(error => {console.error('PUT 請(qǐng)求失敗:', error);// 可以在這里進(jìn)行統(tǒng)一的錯(cuò)誤處理throw error; // 繼續(xù)拋出錯(cuò)誤,讓調(diào)用者可以捕獲});
};

參考vue+element UI 學(xué)習(xí)總結(jié)筆記(一)_vue+elementui一點(diǎn)-CSDN博客

http://www.risenshineclean.com/news/39378.html

相關(guān)文章:

  • 制作網(wǎng)站和制作網(wǎng)頁(yè)的分別免費(fèi)獎(jiǎng)勵(lì)自己的網(wǎng)站
  • 公家網(wǎng)站模板百度代運(yùn)營(yíng)
  • 做服務(wù)員哪個(gè)網(wǎng)站靠譜營(yíng)業(yè)推廣策劃方案
  • 制作網(wǎng)站圖片磁力屋torrentkitty
  • 廈門旅游網(wǎng)站設(shè)計(jì)湖南seo優(yōu)化
  • 北京外貿(mào)網(wǎng)站建設(shè)公司怎么在百度發(fā)廣告
  • 免費(fèi)做明信片的網(wǎng)站新區(qū)快速seo排名
  • 小型企業(yè)網(wǎng)站的設(shè)計(jì)與實(shí)現(xiàn)搜索引擎營(yíng)銷的典型案例
  • 免費(fèi)網(wǎng)站建設(shè)步驟百度收錄權(quán)重
  • 網(wǎng)站投票系統(tǒng) js產(chǎn)品推廣方案范文500字
  • 惠州做網(wǎng)站的公司百度指數(shù)怎么看排名
  • 建設(shè)一個(gè)怎樣的自己的網(wǎng)站首頁(yè)鄭州粒米seo顧問(wèn)
  • 建設(shè)電影網(wǎng)站廣告哪里找搜索引擎推廣法
  • 做app+的模板下載網(wǎng)站短視頻精準(zhǔn)獲客
  • 武漢網(wǎng)站制2023年8月份新冠
  • 佛山新網(wǎng)站制作咨詢東莞全網(wǎng)推廣
  • 深圳做網(wǎng)站的公司搜行者seo如何制作微信小程序店鋪
  • 公司網(wǎng)站 開源深圳seo專家
  • 供應(yīng)鏈管理軟件十大排名seo顧問(wèn)培訓(xùn)
  • 網(wǎng)站管理員登錄哪有學(xué)電腦培訓(xùn)班
  • 蘇州個(gè)人網(wǎng)站建設(shè)信息推廣的方式有哪些
  • 做一個(gè)wordpress模板關(guān)鍵詞首頁(yè)排名優(yōu)化平臺(tái)
  • 西安有什么網(wǎng)站網(wǎng)絡(luò)輿情監(jiān)測(cè)中心
  • 建站的步驟有哪些杭州網(wǎng)站
  • php網(wǎng)站開發(fā)代碼東莞做網(wǎng)站最好的是哪家
  • 邯鄲網(wǎng)站制作多少錢蘇州網(wǎng)站建設(shè)制作公司
  • 貴州省城鄉(xiāng)和建設(shè)廳網(wǎng)站seo優(yōu)化的作用
  • 游戲網(wǎng)站風(fēng)格dz論壇seo
  • 阿里云 做購(gòu)物網(wǎng)站網(wǎng)站seo是什么平臺(tái)
  • 上海網(wǎng)站建設(shè)心得win10一鍵優(yōu)化工具