1. 程式人生 > >promise 與 fetch 詳細介紹 與 使用

promise 與 fetch 詳細介紹 與 使用

1. promise

1.1  含義

Promise 是非同步程式設計的一種解決方案,比傳統的解決方案——回撥函式和事件——更合理和更強大;

1.2  基本語法

new Promise(function(resolve, reject) {
  // ... some code 比如傳送ajax
  
  if (/* 非同步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
}).then(data => {})
.catch( err => {});

1.3 狀態

三個方法呼叫,對應三個狀態修改;pending--> notify(); fulfilled--> resolve() ; unfulfilled  ->reject();三個方法返回的ren

1.4 方法介紹:

Promise:  構造方法,裡面傳遞一個函式,這個函式體內一般非同步操作,成功呼叫resolve 方法,反之呼叫reject 方

then: 指定resolved狀態和rejected狀態的回撥函式。引數說明,第一個是狀態為成功的回撥函式,第二個是失敗的回撥

如果當前Promise物件狀態為成功,那麼在 new promise((resolve, reject) =>{resolve()}).then(data=>{}) ;then的第一個回撥將被呼叫;

catch:在非同步操作丟擲異常時觸發,如果promise狀態為 unfulfilled  也將會被觸發;

all :非同步操作並行執行,當同時執行完畢後,才會執行

race: 當多個非同步操作一同執行,當有一個執行完畢,那麼方法將被執行

1.5  一般使用

const getJson = () =>{

    return new Promise((resolve, reject) => {

        setTimeout(()=>{
            
            let a = Math.random()*10;
            if(a<5){
                resolve(a);
            }else{
                reject(a);
            }              

        },1000);    
    });
}

let returnData = getJson().then(data => {
   
    console.log("我是成功回撥!"+data);
}).catch( err => {
    
    console.log("我是失敗回撥!"+err);
})

2. fetch 

2.1 介紹

fetch是用來取代傳統的XMLHttpRequest

2.2 基本語法

fetch('user/v1/getInfo',{
    method:'get',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
      'X-Requested-With': 'XMLHttpRequest',
    },
    body: new FormData(document.getElementById('comment-form'))
    //或者
    //body: JSON.stringify({
    //    email: '[email protected]'
    //    name: 'jim'
    //})
}).then(response =>{
    const type = 'json';
    //response 這個物件並不與 servlet中的一樣
    if(type==='json'){
        return response.text(); //返回一個text的resolve的promise物件
    }else{
        return response.json(); //返回一個json的resolve的promise物件
    }
}).then(data => {
    console.log("返回的資料!");
    //可以設定返回一個 promise物件 的狀態

}).catch(err => {
    console.log("請求異常!");

})

2.3 方法物件介紹

Response 代表響應, fetch 的 then 方法接收一個 Response 例項, 當然你也可以手動建立 Response 物件 —— 比如在 service workers 中可能會用到. Response 可以配置的引數包括:

  • type - 型別,支援: basiccors
  • url - 響應的 URL
  • useFinalURL - Boolean 值, 說明這是否是響應的最終 URL
  • status - 狀態碼 (例如: 200404, 等等)
  • ok - Boolean值,代表響應是否成功(status 值在 200-299 之間)
  • statusText - 與狀態碼相對應的狀態值(例如: OK為200)
  • headers - 與響應相關聯的 Headers 物件.
  • redirected - 指示響應是否是重定向的結果。也就是說,它的 URL 列表有多條目錄。

Response 提供的方法如下:

  • clone() - 建立一個 Response 物件的克隆.
  • error() - 返回一個與網路錯誤相關的新 Response 物件.
  • redirect() - 重定向,使用新的 URL 建立新的 response 物件..
  • arrayBuffer() - 返回一個 resolve 是 ArrayBuffer 的 promise 物件。
  • blob() - 返回一個 resolve 是 Blob 的 promise 物件。
  • formData() - 返回一個 resolve 是 FormData  的 promise 物件。
  • json() - 返回一個 resolve 是 JSON 的 promise 物件。
  • text() - 返回一個 resolve 是文字的 promise 物件。

Request 物件表示一次 fetch 呼叫的請求資訊。傳入 Request 引數來呼叫 fetch, 可以執行很多自定義請求的高階用法:

  • method - 支援 GETPOSTPUTDELETEHEAD
  • url - 請求的 URL
  • headers - 對應的 Headers 物件
  • referrer - 請求的引用者(例如:client)
  • mode - 是否允許跨域請求,以及哪些響應的屬性是可讀的。可選值:
  • cors:(預設),允許跨域請求,將遵守 CORS 協議。
  • no-cors:該模式允許來自 CDN 的指令碼、其他域的圖片和其他一些跨域資源。前提條件是請求的 method 只能是 HEAD、GET 或 POST。此外,如果 ServiceWorkers 攔截了這些請求,它不能隨意新增或者修改除這些之外 Header 屬性。第三,js 不能訪問 Response 物件中的任何屬性,這確保了跨域時 ServiceWorkers 的安全和隱私資訊洩露問題。
  • same-origin:如果是一個跨域請求,將返回一個 error。
  • navigate:支援導航的模式,僅用於 HTML 導航。
  • credentials - 設定 cookies 是否隨請求一起傳送。可選值: 
  • omit:(預設),不傳送 Cookie。
  • same-origin:同域下自動傳送 Cookie。
  • include:始終傳送 Cookie,即使是跨域。
  • redirect - 定義重定向處理方式。可選值:follow(預設), error, manual。
  • integrity - 子資源完整性值。
  • cache - 設定快取模式。可選值: 
  • default:瀏覽器在其 HTTP 快取中查詢匹配的請求。
  •       a. 如果匹配並且是新鮮的,它將從快取中返回。
  •       b. 如果存在匹配但已失效,則瀏覽器將向遠端伺服器發出有條件的請求。如果伺服器指出資源沒有改變,它將從快取中返回。否則資源將從伺服器下載並且快取將被更新。
  •       c. 如果沒有匹配,瀏覽器將發出正常的請求,並且下載的資源更新快取。
  • no-store:瀏覽器從遠端伺服器獲取資源,而不先檢視快取,並且不會使用下載的資源更新快取。
  • reload:瀏覽器從遠端伺服器獲取資源,而不先檢視快取,但隨後將使用下載的資源更新快取。
  • no-cache:瀏覽器在其 HTTP 快取中查詢匹配的請求。
  •       a. 如果匹配,新鮮或陳舊,瀏覽器將向遠端伺服器發出有條件的請求。如果伺服器指出資源沒有改變,它將從快取中返回。否則資源將從伺服器下載並且快取將被更新。
  •       b. 如果沒有匹配,瀏覽器將發出正常的請求,並用下載的資源更新快取。
  • force-cache:瀏覽器在其 HTTP 快取中查詢匹配的請求。
  •       a. 如果有匹配,新鮮或陳舊,它將從快取中返回。
  •       b. 如果沒有匹配,瀏覽器將發出正常的請求,並用下載的資源更新快取。
  • only-if-cached:瀏覽器在其 HTTP 快取中查詢匹配的請求。只能用在 mode 為 same-origin 的情況下
  •       a. 如果匹配,新鮮或陳舊,將從快取中返回。
  •       b. 如果沒有匹配,瀏覽器將返回一個錯誤。

3. promise 與 fetch 聯合使用

const ajax_ = (url,args,type='json') => {
    
    return new Promise((resolve, reject) => {
      fetch(url,args).then(function (response) {
      let data = '';
      if (type === 'json')
        data = response.json();
      else
        data = response.text();
      return data;
    }).then(data => {
      if (type === 'json' && data.code==404 ) {
        console && console.error('請求異常:'+data.msg);
        reject('請求異常:'+data.msg);
      
      }else {
        resolve(data);
      }
    }).catch(function (ex) {
      console && console.error('請求異常:'+ex);
      reject('請求異常:'+ex);
    });
  });
}

ajax_ ('user/v1/getInfoById',{method:'get',headers:{...},body:{username,password}});

相關推薦

promise fetch 詳細介紹 使用

1. promise 1.1  含義 Promise 是非同步程式設計的一種解決方案,比傳統的解決方案——回撥函式和事件——更合理和更強大; 1.2  基本語法 new Promise(function(resolve, reject) { // ... some

android開發框架總結 (二)MVPMVVM詳細介紹對比,如何選擇適合的框架(乾貨!)

前言 本篇文章將非常“細緻”地總結分析MVP與MVVM這兩種框架對於架構的選擇做了比較多的分析,應該是乾貨滿滿,如果你對這兩者的使用與選擇上還有迷惑之處。真的希望你能認真看完。 如果你是非常有經驗的程式猿,那就當相互學習總結,如果有不同看法還望指教。當然,我也是非常想進步的。  

文件上傳到tomcat服務器 commons-fileupload的詳細介紹使用

部分 中文字符 form 引用 編碼 path -type dex item 三個類:DiskFileUpload、FileItem和FileUploadException。這三個類全部位於org.apache.commons.fileupload包中。 首先需要說明一下f

二、Linux系統硬鏈接和軟鏈接詳細介紹實踐

導致 9.png 創建 訪問 tap 除了 all window tor 鏈接的概念 在linux系統中,鏈接可分為兩種:一種被稱為硬鏈接(Hard LinK),另一種被稱為軟鏈接或符號鏈接(Symbolic Link)。在默認不帶參數的情況下,執行ln命令創建的鏈

docker集群(二)--portainer+TLS安全連接docker主機(詳細介紹使用心得)

chm log usr tls term 參考 正常 pac 文件中 http://blog.51cto.com/mysky0708/2298049承接上文,在生產中如何安全的鏈接docker主機呢?我們采用TLS秘鑰方式。步驟:第一部分:首先在docker主機上生成秘鑰,

AES加密演算法的詳細介紹實現

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "aes.h" /** * S盒 */ static const int S[16][16] = { 0x63, 0

Tensorflow stack unstack 詳細介紹

tf.stack() tf.stack(values, axis=0, name=’stack’) 以指定的軸axis,將一個維度為R的張量陣列轉變成一個維度為R+1的張量。即將一組張量以指定的軸,提高一個維度。 假設要轉變的張量陣列values的長度為N,其

HashMapConcurrentHashMap詳細介紹文章

前言 Map 這樣的 Key Value 在軟體開發中是非常經典的結構,常用於在記憶體中存放資料。 本篇主要想討論 ConcurrentHashMap 這樣一個併發容器,在正式開始之前我覺得有必要談談 HashMap,沒有它就不會有後面的 Concurrent

Dubbo詳細介紹安裝使用過程

1 Dubbo介紹 1.1 dubbox簡介 隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。 單一應用架構  當網站流量很小

IIS和ASP的標題廣告管理系統的詳細介紹使用

  標題廣告是Web上最常見的廣告形式。本文介紹了一個基於IIS和ASP的標題廣告管理系統,該系統支援廣告客戶和廣告的管理,能夠隨機選擇廣告並生成顯示廣告的HTML程式碼(但參考廣告的等級、顯示次數限制、點選次數限制),並能夠記錄廣告顯示、點選的歷史紀錄。   一、資料庫表結構   標題廣告也就是Bann

localStorage詳細介紹(sessionStorage的區別)

HTML5上的LocalStorage基本用法 1.獲取localStorage的長度:window.localStorage.length 2.新增/編輯localStorage的內容:window.localStorage.setItem(鍵,值); 3.根

Quartz中時間表達式詳細介紹樣例分析

Quartz中時間表達式的設定-----corn表示式 時間格式: <!-- s m h d m w(?) y(?) -->,   分別對應: 秒>分>小時>日>月>周>年,  舉例: 1.每天什麼時候執行: 0 59 23 * * ?

終於等到你,最強 IDE Visual Studio 2017 正式版釋出(附詳細介紹下載地址)

Visual Studio 2017 正式版釋出,該版本不僅添加了實時單元測試、實時架構依賴關係驗證等新特性,還對許多實用功能進行了改進,如程式碼導航、IntelliSense、重構、程式碼修復和除錯等等。無論使用哪種語言或平臺,都能節省開發者在日常任務上花費的時

Yarn的安裝使用詳細介紹

不知道大家有沒有覺察到Facebook近年大招頻出。Yarn是Facebook最近釋出的一款依賴包安裝工具。Yarn是一個新的快速安全可信賴的可以替代NPM的依賴管理工具,Yarn正式釋出沒幾天已經迅速達到了數萬贊,就可以知道大家苦NPM久已。這篇文章將詳細介紹Yarn的安

SQLite中的WAL機制詳細介紹-回滾日誌原理

執行c 預測 修改 blog 回滾 事務性 優點 shm nal 一、什麽是WAL? WAL的全稱是Write Ahead Logging,它是很多數據庫中用於實現原子事務的一種機制,SQLite在3.7.0版本引入了該特性。 二、WAL如何工作? 在引入WAL機制之

【模式識別機器學習】——PCAKernel PCA介紹對比

  PCA與Kernel PCA介紹與對比 1. 理論介紹   PCA:是常用的提取資料的手段,其功能為提取主成分(主要資訊),摒棄冗餘資訊(次要資訊),從而得到壓縮後的資料,實現維度的下降。其設想通過投影矩陣將高維資訊轉換到另一個座標系下,並通過平移將資料均值變為零。PCA認為,在變換過後的

C++字串流stringstreamstring知識介紹用法小結

之前總結了C++的檔案輸出輸入流的相關知識,通過介紹底層的streambuf緩衝區,從而與stringstream流(字串流)聯絡了起來,本文就對此進行簡單的介紹。 首先介紹string。 string 是 C++ 提供的字串類,和 C 型別的字串相比,除了有

CookieSession的介紹區別

 本文分別對Cookie與Session做一個介紹和總結,並分別對兩個知識點進行對比分析,讓大家對Cookie和Session有一個更深入的瞭解,並對自己的開發工作中靈活運用帶來啟示。 一、Cookie機制      Cookies是伺服器在本地機器上儲存的小段

Huffman樹Huffman編碼—介紹基本應用

今天來談談huffman樹吧。 先介紹一下樹的路徑長度(path length of a tree,PL),和樹的帶權路徑長度(Weighted Path Length of Tree,WPL)。我們定義每個節點到樹根的距離為l[i]。樹的路徑長度(PL):所有節點到根的距

Spring BeanFactoryFactoryBean的區別及其各自的詳細介紹於用法

排除 tle 判斷 service 關系 符號 它的 extc () 1. BeanFactory   BeanFactory,以Factory結尾,表示它是一個工廠類(接口),用於管理Bean的一個工廠。在Spring中,BeanFactory是IOC容器的核心接口,它的