Promise介紹和使用

Promise

Promise是一門新的技術(ES6規范),JS中進行異步編程的新解決方案。(舊的方案是使用回調函數,比如AJAX請求)。
從語法上來說Promise是一個構造函數。
從功能上來說Promise對象用來封裝一個異步操作并可以獲取其成功/失敗的結果值。

Promise初體驗

<script>//普通實現異步方法setTimeout()const btn = document.querySelector('#btn');btn.addEventListener('click',()=>{setTimeout(()=>{alert('1秒后執行');},1000);});document.querySelector('#btn1').addEventListener('click',()=>{//使用Promise//1. resolve 函數類型數據,異步執行成功回調//2. reject 函數類型數據,異步執行失敗回調const promise = new Promise((resolve,reject)=>{setTimeout(()=>{//獲取1-10的隨機數let n = Math.floor(Math.random() * (10 - 1 + 1)) + 1;if(n <= 5){resolve(n); //將promise對象狀態設置為 成功console.log('resolve');}else{reject(n);//將promise對象狀態設置為 失敗console.log('resolve');}},1000);});//調用then方法獲取異步函數執行狀態,執行的是resolve/reject//接受兩個函數 resolve & rejectpromise.then((val)=>{alert('resolve ' + val);},(val)=>{alert('reject ' + val);});});</script>

catch方法

const promise = new Promise((resolve,reject)=>{//獲取1-10的隨機數let n = Math.floor(Math.random() * (10 - 1 + 1)) + 1;if(n<=5){resolve(n);}else{reject(n);}}).then((val)=>{console.log('success' + val);}).catch((err)=>{console.log('failure' + err);});

使用Promise封裝AJAX請求

  const btn = document.querySelector('#btn');btn.addEventListener('click',()=>{const promise = sendAJAX('http://localhost/test');//調用then方法promise.then((val)=>{//成功console.log(val);},(val)=>{//失敗console.log(val);});});function sendAJAX(url){const promise = new Promise((resolve,reject)=>{//1. AJAX請求 , 創建http客戶端const http = new XMLHttpRequest();//2. 初始化http.open('GET',url);//3. 發送請求http.send();//4. 處理響應結果http.onreadystatechange = function(){if(http.readyState === 4){if(http.status == 200){//成功resolve(http.response);}else{//失敗reject(http.status);}}}});return promise;}

Promise屬性

PromiseState:Promise狀態

  1. pending:等待,初始化默認值
  2. resolved / fullfilled:表示成功
  3. rejected:表示失敗

PromiseResult:保存著對象的結果。成功/失敗

  1. resolve():resolve方法會把狀態改為成功,并且存成功的結果
  2. reject():reject方法會把狀態改為失敗,并且保存失敗結果

Promise方法

  1. Promise.resolve()方法:如果傳入的參數是非Promise類型的對象,則返回結果是成功的Promise對象,如果傳入的參數為Promise對象,則參數的結果決定了resolve的結果
    let promise = Promise.resolve(1);console.log(promise);promise = Promise.resolve(new Promise((resolve,reject)=>{//resolve();reject();}));console.log(promise);
    
  2. Promise.reject()方法:快速的返回一個失敗的Promise對象,無論傳入什么,返回結果都是失敗。
    let promise = Promise.reject(1)
    console.log(promise);
    
  3. Promise.all()方法:傳入Promise數組,只有所有的Promise對象都成功才成功,只要有一個失敗就直接失敗。成功的返回結果是全部的Promise對象。無論有多少個失敗,都會執行完全部的Promise。
      const p1 = new Promise((resolve,reject)=>{resolve();console.log(1)})const p2 = new Promise((resolve,reject)=>{reject();console.log(2)})const p3 = new Promise((resolve,reject)=>{reject();console.log(3)})let promises = Promise.all([p1,p2,p3])console.log(promises);
    
  4. Promise.race()方法:傳入Promise數組,第一個完成的Promise的結果的狀態就是最終的結果狀態。結果也是第一個成功返回的結果。
      const p1 = new Promise((resolve,reject)=>{resolve();console.log(1)})const p2 = new Promise((resolve,reject)=>{reject();console.log(2)})const p3 = new Promise((resolve,reject)=>{reject();console.log(3)})let promises = Promise.race([p1,p2,p3])console.log(promises);
    

Promise關鍵知識

  1. 如何改變Promise狀態
    const promise = new Promise((resolve,reject)=>{//1. 調用resolve()方法,改為成功狀態resolve();//2. 調用reject()方法,改為失敗狀態reject();//3. 拋出一個異常改為失敗狀態 throwthrow 'has error';})
    
  2. 可以為Promise指定多個then函數,都會被執行
      const promise = new Promise((resolve,reject)=>{resolve();}).then(()=>{console.log(1);}).then(()=>{console.log(2);}).then(()=>{console.log(3);});
    
  3. then和catch函數,是執行器里執行reslove()或者reject()方法才會執行
    const promise = new Promise((resolve,reject)=>{setTimeout(()=>{console.log('setTimeout');resolve();},2000)}).then(()=>{console.log(1);}).then(()=>{console.log(2);}).then(()=>{console.log(3);});
    

Promise鏈式調用

Promise的then方法可以返回Promise對象,當返回Promise對象時,后續的then方法接受到的參數是上一個then返回Promise返回的對象的返回值,如下。
也就是說,可以實現對異步操作的鏈式調用,只用上一個異步執行接受,有返回值的時候才會執行下一個then,不需要自己去判斷線程的狀態。

 //三個異步方法,最后輸出為 1 2 3const promise = new Promise((resolve,reject)=>{//1. 第一個異步方法setTimeout(()=>{resolve(1);},2000)}).then((val)=>{console.log(val);return new Promise((resolve,reject)=>{//2. 第二個異步方法setTimeout(()=>{resolve(2);},1000)})}).then((val)=>{console.log(val);return new Promise((resolve,reject)=>{//3. 第三個異步方法setTimeout(()=>{resolve(3);},1000)})}).then((val)=>{console.log(val);});

鏈式調用的異常穿透

鏈式調用過程中,只需要有一個catch,如果其中某一環節出錯,拋出異常throw 'error msg',則會執行catch的函數,不會繼續執行接下來的任務。

 const promise = new Promise((resolve,reject)=>{setTimeout(()=>{resolve(1);},2000)}).then((val)=>{console.log(val);return new Promise((resolve,reject)=>{setTimeout(()=>{//拋出異常直接執行catch,不會執行繼續執行,因為沒有執行到resolve()方法throw 'error';resolve(2);},1000)})}).then((val)=>{console.log(val);return new Promise((resolve,reject)=>{setTimeout(()=>{resolve(3);},1000)})}).then((val)=>{console.log(val);}).catch(err=>{console.log(err);});

中斷鏈式調用

  1. 中斷鏈式調用的方法是返回一個空函數的Promise對象new Promise(()=>{})這樣就不會跳入下一個then里面
  2. 在某些業務場景中可以拋出異常來中斷Promise,如上異常穿透也是終止了鏈式調用。這種直接調用了catch,也屬于另類的終止
 promise = new Promise((resolve,reject)=>{setTimeout(()=>{resolve(1);},2000)}).then((val)=>{console.log(val);//終止鏈式調用return new Promise(()=>{})}).then((val)=>{console.log(2);return new Promise((resolve,reject)=>{setTimeout(()=>{resolve(3);},1000)})}).then((val)=>{console.log(val);}).catch(err=>{console.log(err);});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211650.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

生成式AI賦能千行百業加速創新,2023亞馬遜云科技re:Invent行業盤點

2023亞馬遜云科技re:Invent全球大會已于上周圓滿閉幕&#xff0c;在本次大會中&#xff0c;亞馬遜云科技又為大家帶來了很多功能/項目迭代更新&#xff0c;也重磅發布了很多全新的功能。今天從行業視角來盤點回顧哪些重磅發布適用于垂直行業客戶&#xff0c;以及面向汽車、制造…

ChatGLM3-6B和langchain阿里云部署

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、ChatGLM3-6B部署搭建環境部署GLM3 二、Chatglm2-6blangchain部署三、Tips四、總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; …

ffmpeg之ffprobe.c源碼分析一---大流程及核心代碼分析

文章目錄 前言為什么學習ffprobe源碼源碼調試main()函數重要流程函數分析open_input_file函數分析avformat_match_stream_specifier函數分析read_packets函數分析本篇文章帶你打通ffprobe源碼的脈絡。 關注公眾號免費看: 前言 注:本文章全憑個人經驗以及平時學習所記錄,由…

gdal合成多個波段

def synthesis_bands(dst_list, outfile):"""將多光譜波段合成一個tif:param dst_list: 輸入待合成文件的列表:param outfile: 影像的輸出文件夾"""dataset_init gdal.Open(dst_list[0])# 創建待輸出的圖tiff_driver gdal.GetDriverByName(GTi…

【MySQL進階】索引使用

一、索引使用 1.驗證索引效率 tb_sku 這張表中準備了 1000w 的記錄。 我用夸克網盤分享了「1000w的模擬數據」鏈接&#xff1a;https://pan.quark.cn/s/15cf665202b2 這張表中id為主鍵&#xff0c;有主鍵索引&#xff0c;而其他字段是沒有建立索引的。 我們先來查詢其中的…

JS基礎之原型原型鏈

JS基礎之原型&原型鏈 原型&原型鏈構造函數創建對象prototypeprotoconstructor實例與原型原型的原型原型鏈其他constructorproto繼承 原型&原型鏈 構造函數創建對象 我們先使用構造函數創建一個對象&#xff1a; function Person(){ } var person new Person();…

多窗口文件管理工具Q-Dir安裝以及使用教程

軟件介紹 Q-Dir 是一款功能強大的Windows資源管理器&#xff0c;可以非常方便的管理你的各種文件。Q-Dir有4 個窗口&#xff0c;特別適用于頻繁在各個目錄間跳躍復制粘貼的情況&#xff0c;每個窗口都可以方便的切換目錄&#xff0c;以不同顏色區分不同類型的文件&#xff0c;…

(企業項目)微服務項目解決跨域問題:

前后端分離項目中前端出現了跨域的問題 在網關模塊配置文件中添加 配置 application.properties # 允許請求來源&#xff08;老版本叫allowedOrigin&#xff09; spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOriginPatterns* # 允許攜帶的頭信息 spri…

idea__SpringBoot微服務06——靜態資源(新依賴),首頁和圖標定制

靜態資源 一、靜態資源二、首頁和圖標定制————————創作不易&#xff0c;如覺不錯&#xff0c;隨手點贊&#xff0c;關注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;謝謝~~ 新依賴&#xff1a;jquery的 <dependency><groupId>org.webjars&…

說說設計體系、風格指南和模式庫

目錄 一、定義 二、設計體系 2.1 Design system 2.2 風格指南 2.3 Component 三、樣式庫 一、定義 設計體系&#xff08;Design system&#xff09;&#xff1a;可共享的設計語言的基礎合集&#xff0c;包含了設計價值&#xff0c;語義&#xff0c;語法和上下文。 風格…

matplotlib 默認屬性和繪圖風格

matplotlib 默認屬性 一、繪圖風格1. 繪制疊加折線圖2. Solarize_Light23. _classic_test_patch4. _mpl-gallery5. _mpl-gallery-nogrid6. bmh7. classic8. fivethirtyeight9. ggplot10. grayscale11. seaborn12. seaborn-bright13. seaborn-colorblind14. seaborn-dark15. sea…

Chart 7 內存優化

文章目錄 前言7.1 Adreno GPU OpenCL內存7.1.1 內存聲明周期7.1.2 Loacl Memory7.1.3 Constant memory(常量內存)7.1.4 Private Memory7.1.5 Global Memory7.1.5.1 Buffer Object7.1.5.2 Image Object7.1.5.3 Image object vs. buffer object7.1.5.4 Use of both Image and buf…

C語言數據結構-雙向鏈表

文章目錄 1 雙向鏈表的結構2 雙向鏈表的實現2.1 定義雙向鏈表的數據結構2.2 打印鏈表2.3 初始化鏈表2.4 銷毀鏈表2.5 尾插,頭插2.6 尾刪,頭刪2.7 根據頭次出現數據找下標2.8 定點前插入2.9 刪除pos位置2.10 定點后插入 3 完整代碼3.1 List.h3.2 Lish.c3.3 test.c 1 雙向鏈表的結…

ajax中get和post的區別,datatype返回的數據類型有哪些?web開發中數據提交的幾種方式,有什么區別。百度使用哪種方式?

在Ajax中&#xff0c;GET和POST是兩種常見的HTTP請求方法。它們有以下區別&#xff1a; GET請求&#xff1a;使用GET請求時&#xff0c;參數數據會附加在URL的末尾&#xff0c;以查詢字符串的形式發送給服務器。GET請求是冪等的&#xff0c;也就是說多次發送相同的GET請求&…

鍵盤打字盲打練習系列之矯正坐姿——4

一.歡迎來到我的酒館 盲打&#xff0c;矯正坐姿&#xff01; 目錄 一.歡迎來到我的酒館二.繼續練習二.矯正坐姿1.鍵鼠快速選購指南2.椅子快速選購指南 三.改善坐姿建議 二.繼續練習 前面的章節&#xff0c;我們重點向大家介紹了主鍵盤區指法和鍵盤鍵位。經過一個系列的教程學習…

Mybatis環境搭建

1、開發環境 IDE&#xff1a;IntelliJ IDEA 2022.2.1 (Ultimate Edition) 構建工具&#xff1a;maven 3.6.1 MySQL版本&#xff1a;MySQL 5.7 MyBatis版本&#xff1a;MyBatis 3.5.14 2、工程創建 創建一個Maven工程giser-java-mybatis-demo 基礎依賴如下&#xff1a; &…

【Python】pip命令及使用

PIP命令 下面是一個整理成表格的pip命令及使用的示例&#xff1a; 命令使用示例說明pip install <package>pip install requests安裝名為"requests"的包pip uninstall <package>pip uninstall requests卸載名為"requests"的包pip listpip li…

用友U8 Cloud 多處反序列化RCE漏洞復現

0x01 產品簡介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成長型、創新型企業,提供企業級云ERP整體解決方案。 0x02 漏洞概述 用友U8 Cloud存在多處(TableInputOperServlet、LoginServlet 、FileTransportServlet、CacheInvokeServlet、ActionHandlerServlet、Servle…

12.9每日一題(備戰藍橋杯循環結構)

12.9每日一題&#xff08;備戰藍橋杯循環結構&#xff09; 題目 2165: 求平均年齡題目描述輸入輸出樣例輸入樣例輸出來源/分類 題解 2165: 求平均年齡題目 2166: 均值題目描述輸入輸出樣例輸入樣例輸出來源/分類 題解 2166: 均值題目 2167: 求整數的和與均值題目描述輸入輸出樣…

GB/T 43212-2023 竹炭板檢測

竹炭塑復合板是指以竹炭粉為主要原料&#xff0c;與塑料及其他助劑復配混合&#xff0c;經熔融擠出或模壓成型等工藝制成的板材。 GB/T 43212-2023 竹炭板測試&#xff1a; 測試項目 測試方法 外觀 GB/T 43212 尺寸 GB/T 19367 含水率 GB/T 17657 密度 GB/T 17657 吸…