<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Fetch() 是 window.fetch 的 JavaScript polyfill。
全域性 fetch()
函數是 web 請求和處理響應的簡單方式,不使用 XMLHttpRequest。這個 polyfill 編寫的接近標準的 Fetch 規範。
fetch()是XMLHttpRequest的升級版,用於在JavaScript指令碼裡面發出 HTTP 請求。
fetch()的功能與 XMLHttpRequest 基本相同,但有三個主要的差異。
(1)fetch()使用 Promise,不使用回撥函數,因此大大簡化了寫法,寫起來更簡潔。
(2)採用模組化設計,API 分散在多個物件上(Response 物件、Request 物件、Headers 物件),更合理一些;相比之下,XMLHttpRequest 的 API 設計並不是很好,輸入、輸出、狀態都在同一個介面管理,容易寫出非常混亂的程式碼
(3)fetch()通過資料流(Stream 物件)處理資料,可以分塊讀取,有利於提高網站效能表現,減少記憶體佔用,對於請求大檔案或者網速慢的場景相當有用。XMLHTTPRequest 物件不支援資料流,
所有的資料必須放在快取裡,不支援分塊讀取,必須等待全部拿到後,再一次性吐出來。在用法上接受一個 URL 字串作為引數,預設向該網址發出 GET 請求,返回一個 Promise 物件
fetch()函數支援所有的 HTTP 方式:
獲取HTML型別資料
fetch('/users.html') .then(function(response) { return response.text() }).then(function(body) { document.body.innerHTML = body })
獲取JSON型別資料
fetch('/users.json') .then(function(response) { return response.json() }).then(function(json) { console.log('parsed json', json) }).catch(function(ex) { console.log('parsing failed', ex) })
fetch(url, options).then(function(response) { // handle HTTP response }, function(error) { // handle network error })
具體引數案例:
require('babel-polyfill') require('es6-promise').polyfill() import 'whatwg-fetch' fetch(url, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, credentials: "same-origin" }).then(function(response) { response.status //=> number 100–599 response.statusText //=> String response.headers //=> Headers response.url //=> String response.text().then(function(responseText) { ... }) }, function(error) { error.message //=> String })
這可能是:
• 一個 USVString 字串,包含要獲取資源的 URL。
• 一個 Request 物件。
options(可選)
一個設定項物件,包括所有對請求的設定。可選的引數有:
• method: 請求使用的方法,如 GET、POST。
• headers: 請求的頭資訊,形式為 Headers 物件或 ByteString。
• body: 請求的 body 資訊:可能是一個 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 物件。注意 GET 或 HEAD 方法的請求不能包含 body 資訊。
• mode: 請求的模式,如 cors、 no-cors 或者 same-origin。
• credentials: 請求的 credentials,如 omit、same-origin 或者 include。
• cache: 請求的 cache 模式: default, no-store, reload, no-cache, force-cache, 或者 only-if-cached。
• 屬性:
o status (number) - HTTP請求結果引數,在100–599 範圍
o statusText (String) - 伺服器返回的狀態報告
o ok (boolean) - 如果返回200表示請求成功則為true
o headers (Headers) - 返回頭部資訊,下面詳細介紹
o url (String) - 請求的地址
• 方法:
o text() - 以string的形式生成請求text
o json() - 生成JSON.parse(responseText)的結果
o blob() - 生成一個Blob
o arrayBuffer() - 生成一個ArrayBuffer
o formData() - 生成格式化的資料,可用於其他的請求
• 其他方法:
o clone()
o Response.error()
o Response.redirect()
• has(name) (boolean) - 判斷是否存在該資訊頭
• get(name) (String) - 獲取資訊頭的資料
• getAll(name) (Array) - 獲取所有頭部資料
• set(name, value) - 設定資訊頭的引數
• append(name, value) - 新增header的內容
• delete(name) - 刪除header的資訊
• forEach(function(value, name){ ... }, [thisContext]) - 迴圈讀取header的資訊
• HTML資料:
fetch('/users.html') .then(function(response) { return response.text() }).then(function(body) { document.body.innerHTML = body })
• IMAGE資料
var myImage = document.querySelector('img'); fetch('flowers.jpg') .then(function(response) { return response.blob(); }) .then(function(myBlob) { var objectURL = URL.createObjectURL(myBlob); myImage.src = objectURL; });
• JSON資料
fetch(url) .then(function(response) { return response.json(); }).then(function(data) { console.log(data); }).catch(function(e) { console.log("Oops, error"); });
fetch(url) .then(response => response.json()) .then(data => console.log(data)) .catch(e => console.log("Oops, error", e))
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) })
fetch('/users', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Hubot', login: 'hubot', }) })
檢查請求狀態
function checkStatus(response) { if (response.status >= 200 && response.status < 300) { return response } else { var error = new Error(response.statusText) error.response = response throw error } } function parseJSON(response) { return response.json() } fetch('/users') .then(checkStatus) .then(parseJSON) .then(function(data) { console.log('request succeeded with JSON response', data) }).catch(function(error) { console.log('request failed', error) })
Promise 物件是一個返回值的代理,這個返回值在promise物件建立時未必已知。它允許你為非同步操作的成功或失敗指定處理方法。 這使得非同步方法可以像同步方法那樣返回值:非同步方法會返回一個包含了原返回值的 promise 物件來替代原返回值。
Promise建構函式接受一個函數作為引數,該函數的兩個引數分別是resolve方法和reject方法。如果非同步操作成功,則用resolve方法將Promise物件的狀態變為“成功”(即從pending變為resolved);如果非同步操作失敗,則用reject方法將狀態變為“失敗”(即從pending變為rejected)。
promise範例生成以後,可以用then方法分別指定resolve方法和reject方法的回撥函數。
//建立一個promise物件 var promise = new Promise(function(resolve, reject) { if (/* 非同步操作成功 */){ resolve(value); } else { reject(error); } }); //then方法可以接受兩個回撥函數作為引數。 //第一個回撥函數是Promise物件的狀態變為Resolved時呼叫,第二個回撥函數是Promise物件的狀態變為Reject時呼叫。 //其中,第二個函數是可選的,不一定要提供。這兩個函數都接受Promise物件傳出的值作為引數。 promise.then(function(value) { // success }, function(value) { // failure });
那麼結合promise後fetch的用法:
//Fetch.js export function Fetch(url, options) { options.body = JSON.stringify(options.body) const defer = new Promise((resolve, reject) => { fetch(url, options) .then(response => { return response.json() }) .then(data => { if (data.code === 0) { resolve(data) //返回成功資料 } else { if (data.code === 401) { //失敗後的一種狀態 } else { //失敗的另一種狀態 } reject(data) //返回失敗資料 } }) .catch(error => { //捕獲異常 console.log(error.msg) reject() }) }) return defer }
呼叫Fech方法:
import { Fetch } from './Fetch' Fetch(getAPI('search'), { method: 'POST', options }) .then(data => { console.log(data) })
• 由於 IE8 是 ES3,需要引入 ES5 的 polyfill: es5-shim, es5-sham
• 引入 Promise 的 polyfill: es6-promise
• 引入 fetch 探測庫:fetch-detector
• 引入 fetch 的 polyfill: fetch-ie8
• 可選:如果你還使用了 jsonp,引入 fetch-jsonp
• 可選:開啟 Babel 的 runtime 模式,現在就使用 async/await
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45