日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

h5的fetch方法_你不需要jQuery(三):新AJAX方法fetch()

發(fā)布時間:2024/4/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 h5的fetch方法_你不需要jQuery(三):新AJAX方法fetch() 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

XMLHttpRequest來完成ajax有些老而過時了。

fetch()能讓我們完成類似 XMLHttpRequest (XHR) 提供的ajax功能。它們之間的主要區(qū)別是,Fetch API 使用了 Promises,它讓接口更簡單、簡潔,避免了回調(diào)的復(fù)雜性,省去了使用復(fù)雜的 XMLHttpRequest API。

如果你之前未使用過 Promises,你應(yīng)該先看看《JavaScript Promises 用法》這篇文章。

基本Fetch用法

讓我們先用一個例子來比較一下使用 XMLHttpRequest 和使用 fetch 之間的不同。我們要請求一個URL,獲取JSON格式的返回結(jié)果。

XMLHttpRequest

一個 XMLHttpRequest 請求需要兩個監(jiān)聽器來捕捉 success 和 error 兩種情形,而且需要調(diào)用 open() 和 send() 方法。

function reqListener() {

var data = JSON.parse(this.responseText);

console.log(data);

}

function reqError(err) {

console.log('Fetch Error :-S', err);

}

var oReq = new XMLHttpRequest();

oReq.onload = reqListener;

oReq.onerror = reqError;

oReq.open('get', './api/some.json', true);

oReq.send();

Fetch

我們的 fetch 請求的代碼基本上是這樣的:

fetch('./api/some.json')

.then(

function(response) {

if (response.status !== 200) {

console.log('Looks like there was a problem. Status Code: ' +

response.status);

return;

}

// Examine the text in the response

response.json().then(function(data) {

console.log(data);

});

}

)

.catch(function(err) {

console.log('Fetch Error :-S', err);

});

我們首先檢查請求響應(yīng)的狀態(tài)是否是 200,然后才按照 JSON 對象分析響應(yīng)數(shù)據(jù)。

fetch()請求獲取的內(nèi)容是一個 Stream 對象。也就是說,當(dāng)我們調(diào)用 json() 方法時,返回的仍是一個 Promise 對象,這是因為對 stream 的讀取也是異步的。

返回數(shù)據(jù)對象的元數(shù)據(jù)(Metadata)

在上面的例子中,我看到了服務(wù)器響應(yīng)對象Response的基本狀態(tài),以及如何轉(zhuǎn)換成JSON。返回的相應(yīng)對象Response里還有很多的元數(shù)據(jù)信息,下面是一些:

fetch('users.json').then(function(response) {

console.log(response.headers.get('Content-Type'));

console.log(response.headers.get('Date'));

console.log(response.status);

console.log(response.statusText);

console.log(response.type);

console.log(response.url);

});

響應(yīng)的對象Response類型

當(dāng)我們執(zhí)行一個fetch請求時,響應(yīng)的數(shù)據(jù)的類型response.type可以是“basic”, “cors” 或 “opaque”。這些類型用來說明應(yīng)該如何對待這些數(shù)據(jù)和數(shù)據(jù)的來源。

當(dāng)請求發(fā)起自同一個域時,響應(yīng)的類型將會是“basic”,這時,對響應(yīng)內(nèi)容的使用將沒有任何限制。

如果請求來自另外某個域,而且響應(yīng)的具有CORs頭信息,那么,響應(yīng)的類型將是“cors”。 “cors” 和 “basic” 類型的響應(yīng)基本是一樣的,區(qū)別在于,“cors”類型的響應(yīng)限制你只能看到的頭信息包括`Cache-Control`, `Content-Language`, `Content-Type`, `Expires`, `Last-Modified`, 和 `Pragma`。

“opaque”類型的響應(yīng)說明請求來自另外一個域,并且不具有 CORS 頭信息。一個opaque類型的響應(yīng)將無法被讀取,而且不能讀取到請求的狀態(tài),無法看到請求的成功與否。當(dāng)前的 fetch() 實(shí)現(xiàn)無法執(zhí)行這樣的請求。原因請參考這篇文章。

你可以給fetch請求指定一個模式,要求它只執(zhí)行規(guī)定模式的請求。這個模式可以分為:

“same-origin” 只有來自同域的請求才能成功,其它的均將被拒絕。

“cors” 允許不同域的請求,但要求有正確的 CORs 頭信息。

“cors-with-forced-preflight” 在執(zhí)行真正的調(diào)用前先執(zhí)行preflight check。

“no-cors” 目前這種模式是無法執(zhí)行的。

定義模式的方法是,使用一個參數(shù)對象當(dāng)做fetch方法的第二個參數(shù):

fetch('http://some-site.com/cors-enabled/some.json', {mode: 'cors'})

.then(function(response) {

return response.text();

})

.then(function(text) {

console.log('Request successful', text);

})

.catch(function(error) {

log('Request failed', error)

});

串聯(lián) Promises

Promises最大的一個特征是,你可以串聯(lián)各種操作。對于fetch來說,我們可以在各個fetch操作里共享一些邏輯操作。

在使用JSON API時,我們需要檢查每次請求響應(yīng)的狀態(tài),然后解析成JSON對象。使用promise,我們可以簡單的將分析狀態(tài)和解析JSON的代碼放到一個單獨(dú)函數(shù)里,然后當(dāng)做promise返回,這樣就是代碼更條理了。

function status(response) {

if (response.status >= 200 && response.status < 300) {

return Promise.resolve(response)

} else {

return Promise.reject(new Error(response.statusText))

}

}

function json(response) {

return response.json()

}

fetch('users.json')

.then(status)

.then(json)

.then(function(data) {

console.log('Request succeeded with JSON response', data);

}).catch(function(error) {

console.log('Request failed', error);

});

我們用 status 函數(shù)來檢查 response.status 并返回 Promise.resolve() 或 Promise.reject() 的結(jié)果,這個結(jié)果也是一個 Promise。我們的fetch() 調(diào)用鏈條中,首先如果fetch()執(zhí)行結(jié)果是 resolve,那么,接著會調(diào)用 json() 方法,這個方法返回的也是一個 Promise,這樣我們就得到一個分析后的JSON對象。如果分析失敗,將會執(zhí)行reject函數(shù)和catch語句。

你會發(fā)現(xiàn),在fetch請求中,我們可以共享一些業(yè)務(wù)邏輯,使得代碼易于維護(hù),可讀性、可測試性更高。

用fetch執(zhí)行表單數(shù)據(jù)提交

在WEB應(yīng)用中,提交表單是非常常見的操作,用fetch來提交表單數(shù)據(jù)也是非常簡潔。

fetch里提供了 method 和 body 參數(shù)選項。

fetch(url, {

method: 'post',

headers: {

"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"

},

body: 'foo=bar&lorem=ipsum'

})

.then(json)

.then(function (data) {

console.log('Request succeeded with JSON response', data);

})

.catch(function (error) {

console.log('Request failed', error);

});

在Fetch請求里發(fā)送用戶身份憑證信息

如果你想在fetch請求里附帶cookies之類的憑證信息,可以將 credentials 參數(shù)設(shè)置成 “include” 值。

fetch(url, {

credentials: 'include'

})

顯而易見,fetch API相比起傳統(tǒng)的 XMLHttpRequest (XHR) 要簡單的多,相比起jQuery里提供ajax API也絲毫不遜色。

總結(jié)

以上是生活随笔為你收集整理的h5的fetch方法_你不需要jQuery(三):新AJAX方法fetch()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。