摘要:可選的參數有請求使用的方法,如。這使得異步方法可以像同步方法那樣返回值異步方法會返回一個包含了原返回值的對象來替代原返回值。實例生成以后,可以用方法分別指定方法和方法的回調函數。
一:語法說明
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 })
1.url
定義要獲取的資源。這可能是:
? 一個 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。
2.response
一個 Promise,resolve 時回傳 Response 對象:
? 屬性:
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()
3.response.headers
? 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的信息
1.GET請求
? 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"); });
使用 ES6 的 箭頭函數后:
fetch(url) .then(response => response.json()) .then(data => console.log(data)) .catch(e => console.log("Oops, error", e))
response的數據
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) })
POST請求
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 對象來替代原返回值。
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) })三:支持狀況及解決方案
原生支持率并不高,幸運的是,引入下面這些 polyfill 后可以完美支持 IE8+ :
? 由于 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83859.html
首先聲明一下,本文不是要講解fetch的具體用法,不清楚的可以參考MDN fetch教程。 引言 說道fetch就不得不提XMLHttpRequest了,XHR在發送web請求時需要開發者配置相關請求信息和成功后的回調,盡管開發者只關心請求成功后的業務處理,但是也要配置其他繁瑣內容,導致配置和調用比較混亂,也不符合關注分離的原則;fetch的出現正是為了解決XHR存在的這些問題。例如下面代碼: f...
摘要:結果證明,對于以上瀏覽器,在生產環境使用是可行的。后面可以跟對象,表示等待才會繼續向下執行,如果被或拋出異常則會被外面的捕獲。,,都是現在和未來解決異步的標準做法,可以完美搭配使用。這也是使用標準一大好處。只允許外部傳入成功或失敗后的回調。 showImg(https://cloud.githubusercontent.com/assets/948896/10188666/bc9a53...
摘要:首先聲明一下,本文不是要講解的具體用法,不清楚的可以參考教程。該模式用于跨域請求但是服務器不帶響應頭,也就是服務端不支持這也是的特殊跨域請求方式其對應的為。 首先聲明一下,本文不是要講解fetch的具體用法,不清楚的可以參考 MDN fetch教程。 fetch默認不攜帶cookie 配置其 credentials 項,其有3個值: omit: 默認值,忽略cookie的發送 sam...
摘要:我們以請求網絡服務為例,來實際測試一下加入多線程之后的效果。所以,執行密集型操作時,多線程是有用的,對于密集型操作,則每次只能使用一個線程。說到這里,對于密集型,可以使用多線程或者多進程來提高效率。 為了提高系統密集型運算的效率,我們常常會使用到多個進程或者是多個線程,python中的Threading包實現了線程,multiprocessing 包則實現了多進程。而在3.2版本的py...
摘要:說明一點,下面演示的請求或請求,都是采用百度中查詢到的一些接口,可能傳遞的有些參數這個接口并不會解析,但不會影響這個接口的使用。 fetch和XMLHttpRequest 如果看網上的fetch教程,會首先對比XMLHttpRequest和fetch的優劣,然后引出一堆看了很快會忘記的內容(本人記性不好)。因此,我寫一篇關于fetch的文章,為了自己看著方便,畢竟工作中用到的也就是一些...
閱讀 3710·2021-11-25 09:43
閱讀 2605·2021-11-18 13:11
閱讀 2213·2019-08-30 15:55
閱讀 3277·2019-08-26 11:58
閱讀 2829·2019-08-26 10:47
閱讀 2234·2019-08-26 10:20
閱讀 1278·2019-08-23 17:59
閱讀 3010·2019-08-23 15:54