最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react-native fetch的具體使用方法

 更新時間:2017年11月01日 08:30:31   作者:請叫我啊亮  
本篇文章主要介紹了react-native fetch的具體使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在前端快速發(fā)展地過程中,為了契合更好的設(shè)計模式,產(chǎn)生了 fetch 框架,此文將簡要介紹下 fetch 的基本使用。

在 AJAX 時代,進(jìn)行請求 API 等網(wǎng)絡(luò)請求都是通過 XMLHttpRequest 或者封裝后的框架進(jìn)行網(wǎng)絡(luò)請求。

現(xiàn)在產(chǎn)生的 fetch 框架簡直就是為了提供更加強(qiáng)大、高效的網(wǎng)絡(luò)請求而生,雖然在目前會有一點瀏覽器兼容的問題,但是當(dāng)我們進(jìn)行 Hybrid App 開發(fā)的時候,如我之前介紹的Ionic 和React Native,都可以使用 fetch 進(jìn)行完美的網(wǎng)絡(luò)請求。

fetch 初體驗

在 Chrome 瀏覽器中已經(jīng)全局支持了 fetch 函數(shù),打開調(diào)試工具,在 Console 中可以進(jìn)行初體驗。先不考慮跨域請求的使用方法,我們先請求同域的資源,如在我的博客頁面中,打開 Console 進(jìn)行如下請求。

fetch("http://blog.parryqiu.com").then(function(response){console.log(response)})

返回的數(shù)據(jù):

這樣就很快速地完成了一次網(wǎng)絡(luò)請求,我們發(fā)現(xiàn)返回的數(shù)據(jù)也比之前的 XMLHttpRequest 豐富、易用的多。

關(guān)于 fetch 標(biāo)準(zhǔn)概覽

雖然 fetch 還不是作為一個穩(wěn)定的標(biāo)準(zhǔn)發(fā)布,但是在其一直迭代更新的 標(biāo)準(zhǔn)描述 中,我們發(fā)現(xiàn)已經(jīng)包含了很多的好東西。

fetch 支持了大部分常用的 HTTP 的請求以及和 HTTP 標(biāo)準(zhǔn)的兼容,如 HTTP Method,HTTP Headers,Request,Response。

fetch 的使用

fetch的入口函數(shù)定義在node_modules/whatwg-fetch.js文件中,如下

 self.fetch = function (input, init) {
  return new Promise(function (resolve, reject) {
   var request = new Request(input, init)
   var xhr = new XMLHttpRequest()
   xhr.onload = function () {
    var options = {
     status: xhr.status,
     statusText: xhr.statusText,
     headers: parseHeaders(xhr.getAllResponseHeaders() || '')
    }
    options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
    var body = 'response' in xhr ? xhr.response : xhr.responseText
    resolve(new Response(body, options))
   }
   xhr.onerror = function () {
    reject(new TypeError('Network request failed'))
   }
   xhr.ontimeout = function () {
    reject(new TypeError('Network request failed888888888888'))
   }
   xhr.open(request.method, request.url, true)
   if (request.credentials === 'include') {
    xhr.withCredentials = true
   }
   if ('responseType' in xhr && support.blob) {
    xhr.responseType = 'blob'
   }
   request.headers.forEach(function (value, name) {
    xhr.setRequestHeader(name, value)
   })
   xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
  })
 }

該函數(shù)在Network/fetch.js中被導(dǎo)出,最終在initializeCore.js中被注冊為global的屬性變?yōu)槿趾瘮?shù)。fetch返回的是一個Promise。

跟隨方法走向,依次調(diào)用的是XMLHttpRequest.js的send -> RCTNetworking.ios.js的sendRequest -> 最終調(diào)到原生端RCTNetworking.mm的sendRequest方法。

相關(guān)問題點:

1、為何fetch函數(shù)無法設(shè)置timeout?

為了設(shè)置fetch的timeout,我會如下定義一個函數(shù)

 _timeout_fetch(fetch_promise, timeout = 15000) {
  let timeout_promise = new Promise(function (resolve, reject) {
   setTimeout(() => {
    reject('timeout promise');
   }, timeout)
  });
  return Promise.race([
   fetch_promise,
   timeout_promise
  ]);
 }

然后如下調(diào)用

 this._timeout_fetch(
    fetch(url, requestParams)
     .then(response => response.json())
     .then(responseData => {
      resolve(responseData);
     })
     .catch(error => {
      reject(error);
     })
   )

先定義一個Promise,其在超時時間結(jié)束后reject。將這個Promise和fetch合并到Promise.race中,則一旦這兩個請求誰先執(zhí)行,另外一個會被舍棄。這樣完成超時時間的設(shè)置。

但是查看源碼發(fā)現(xiàn)oc中是有超時時間設(shè)置這個選項的,且js和oc通信時也傳了這個參數(shù),問題是出在入口函數(shù)fetch處,只需要在上面fetch方法中添加上如下

 xhr.timeout = init.timeout || 0;

就可以在請求參數(shù)中設(shè)置超時時間了,如

 let requestParams = {
   method: method,
   header: {
    "Content-Type": "application/json;charset=UTF-8",
   },
   timeout: 1000
  };

2、fetch函數(shù)為何無法cancel?

fetch在原生端是NSURLSessionDataTask發(fā)的請求,這個是可取消的。在js端的XMLHttpRequest.js中也發(fā)現(xiàn)了abort方法,調(diào)用能夠取消當(dāng)前網(wǎng)絡(luò)請求。問題出在了fetch的接口函數(shù)。

首先,要想請求能夠取消,得拿到當(dāng)前請求對應(yīng)的requestId。請求的執(zhí)行順序是js端發(fā)起 -> OC生成Request,得到requestId,利用NSURLSessionDataTask發(fā)起請求 -> 將requestId通過回調(diào)的形式傳回給js端,js若想取消該請求,執(zhí)行abort方法即可。

要想fetch函數(shù)能夠執(zhí)行cancel,只需該方法將XMLHttpRequest對象返回即可。但是那樣,就不再是一個Promise了。
也可以將cancel方法綁定到返回的Promise對象上,修改方法如下

 self.fetch = function (input, init) {
  var xhr = new XMLHttpRequest()
  let p = new Promise(function (resolve, reject) {
   var request = new Request(input, init)
   // xhr的各種設(shè)置,回調(diào)等
  })
  p.cancel = () => {
   xhr.abort()
  }
  return p;
 }

如此,調(diào)用的時候就比較惡習(xí)了,要如下

  let promise = fetch(url);
  promise.then(res => {
  }).then(res => {
  }).catch(err => {
  })
  promise.cancel() // 取消該網(wǎng)絡(luò)請求

不能fecth().then().then()的模式調(diào)用,因為這樣會導(dǎo)致返回的那個Promise不再是上面綁定了cancel的那個Promise。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • React如何使用錯誤邊界(Error Boundaries)捕獲組件錯誤

    React如何使用錯誤邊界(Error Boundaries)捕獲組件錯誤

    在 React 里,錯誤邊界就像是一個“小衛(wèi)士”,專門負(fù)責(zé)在組件出現(xiàn)錯誤時挺身而出,避免整個應(yīng)用因為一個小錯誤就崩潰掉,下面小編就來為大家介紹一下如何利用它捕獲組件錯誤吧
    2025-03-03
  • React?Router?v6路由懶加載的2種方式小結(jié)

    React?Router?v6路由懶加載的2種方式小結(jié)

    React?Router?v6?的路由懶加載有2種實現(xiàn)方式,1是使用react-router自帶的?route.lazy,2是使用React自帶的?React.lazy,下面我們就來看看它們的具體實現(xiàn)方法吧
    2024-04-04
  • 詳解react服務(wù)端渲染(同構(gòu))的方法

    詳解react服務(wù)端渲染(同構(gòu))的方法

    這篇文章主要介紹了詳解react服務(wù)端渲染(同構(gòu))的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • react中關(guān)于useCallback的用法

    react中關(guān)于useCallback的用法

    這篇文章主要介紹了react中關(guān)于useCallback的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • React-hooks面試考察知識點匯總小結(jié)(推薦)

    React-hooks面試考察知識點匯總小結(jié)(推薦)

    這篇文章主要介紹了React-hooks面試考察知識點匯總,Hook?使你在無需修改組件結(jié)構(gòu)的情況下復(fù)用狀態(tài)邏輯,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • React Hook之使用Effect Hook的方法

    React Hook之使用Effect Hook的方法

    這篇文章主要為大家詳細(xì)介紹了React 使用Effect Hook的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • react項目如何運行在微信公眾號

    react項目如何運行在微信公眾號

    這篇文章主要介紹了react項目如何運行在微信公眾號,幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下
    2021-04-04
  • 基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    這篇文章主要介紹了基于React-Dropzone開發(fā)上傳組件,主要講述的是在React-Flask框架上開發(fā)上傳組件的技巧,需要的朋友可以參考下
    2021-08-08
  • Remix集成antd和pro-components的過程示例

    Remix集成antd和pro-components的過程示例

    這篇文章主要為大家介紹了Remix集成antd和pro-components的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • React中 Zustand狀態(tài)管理庫的使用詳解

    React中 Zustand狀態(tài)管理庫的使用詳解

    Zustand?是一個非常輕量、簡潔的狀態(tài)管理庫,旨在為 React 提供簡便且高效的狀態(tài)管理,相比于 Redux 或 Context API,Zustand 具有更簡潔、靈活和易于理解的優(yōu)點,感興趣的朋友一起看看吧
    2024-12-12

最新評論

壤塘县| 绥滨县| 邢台市| 陵水| 临漳县| 大厂| 赣榆县| 吉隆县| 民勤县| 万年县| 涿州市| 大安市| 阳城县| 抚州市| 卫辉市| 富宁县| 南漳县| 重庆市| 达孜县| 高尔夫| 大埔区| 龙江县| 湄潭县| 南江县| 苍溪县| 历史| 荥阳市| 马龙县| 湘潭县| 兰西县| 正镶白旗| 锡林郭勒盟| 镇宁| 灵山县| 绍兴县| 彝良县| 凌海市| 马公市| 洪湖市| 岫岩| 方山县|