VUE Promise基礎語法

目錄

異步和同步

異步的問題

new Promise語法

promise的狀態

promise.then()

Promise.resolve()

Promise.reject()

Promise.all()

Promise.race()

Promise.catch()

Promise.finally()


異步和同步

同步模式下,代碼按順序執行,前一條執行完畢后,進行后一條的執行。

異步模式下,代碼可以不按順序執行,不同行的代碼可以同時執行。

異步的問題

有時,一條代碼需要一個異步操作的返回值才能進行計算,這就會導致回調問題,promise語法可以優雅地解決回調。

new Promise語法

new Promise用于創建Promise實例,其參數是一個函數。

const demo = new Promise( ( resolve, reject )=>{if(){...resolve();    }if(){...reject();}}
)

作為參數的函數接收兩個參數。為resolve和reject(參數名可以修改,但一般都用resolve和reject),resolve和reject也為函數。

promise的狀態

promise實例具有三個狀態:成功(fulfilled,但有時也叫resolved)、失敗、待定。

當調用resolve()函數時,promise的狀態會變成成功。

當調用reject()函數時,promise的狀態會變為失敗。

當promise的狀態為成功或失敗時,會進入Promise.then()。

在new Promise中,若調用throw,會觸發reject狀態。

        let a = new Promise((resolve,reject)=>{throw Error('error!');});console.log(a);

promise.then()

接收兩個參數,第一個參數是promise狀態變為成功時,執行的函數,第二個參數是promise狀態為失敗時調用的函數。

demo.then(()=>{//如果resolve被觸發,執行的函數},()=>{//如果reject被觸發,執行的函數}
)

傳參

在new Promise參數函數中,reject和resolve可以傳遞參數,在.then對應的處理函數中,可以獲得這個參數,且兩個參數的名稱不需要對應。

    const demo = new Promise( ( resolve, reject )=>{if(){...resolve(num1);    }if(){...reject(num2);}}).then((resolveData)=>{...},(rejectData)=>{})

.then中的參數名resolveData和rejectData是可以修改的,這里只是隨便起的名字,不是一定要叫這個。

Promise.resolve()

Promise.resolve()方法返回一個Promise對象。

Promise.resolve的參數為非Promise參數時,其返回的Promise對象狀態為成功,值為傳入的參數。

若Promise.resolve的參數為Promise參數,其返回的Promise對象的狀態與值,取決于參數Promise。

        let a = Promise.resolve(1);let b = Promise.resolve(function(){return 1+1;});let c = Promise.resolve(new Promise((resolve,reject)=>{reject();}));console.log(a);console.log(b);console.log(c);

Promise.reject()

與Promise.resolve()類似。

但與resolve不同的是,不管傳入的參數如何,返回的Promise狀態都是失敗。

傳入的參數是什么,該參數的返回值會成為返回的Promise的值。

即使傳入的參數是成功的Promise對象,返回值也是失敗的Promise。

        let a = Promise.reject(new Promise((resolve,reject)=>{resolve("resolve!!!");}));console.log(a);

當傳入的參數是成功的Promise,這個Promise會作為失敗Promise的值。但返回的Promise狀態仍然是失敗。

當傳入的參數是失敗的Promise,整個失敗的Promise會作為返回的Promise的值。

        let a = Promise.reject(new Promise((resolve,reject)=>{reject("reject!!!");}));console.log(a);

Promise.all()

Promise.all()方法接收一個數組。

該數組一般情況下,其中每一個元素都是Promise。

其返回的結果也是Promise,只有當數組中所有的Promise都成功時,才返回成功,成功的結果是每個Promise對象成功結果組成的一個數組,否則返回失敗,失敗的結果是第一個失敗的Promise的結果。

Promise全成功的情況下:

若傳入的參數不是Promise,則該參數會被視為成功值。

        let p1 = Promise.resolve(1);let p2 = 2;let p3 = Promise.resolve(3);let p4 = new Promise((resolve,reject)=>{resolve('ok');});let a = Promise.all([p1,p2,p3,p4]);console.log(a);

有失敗Promise的情況下:

        let p1 = Promise.resolve(1);let p2 = 2;let p3 = Promise.reject(3);let p4 = new Promise((resolve,reject)=>{resolve('ok');});let p5 = new Promise((resolve,reject)=>{reject('reject');})let a = Promise.all([p1,p2,p3,p4,p5]);console.log(a);

Promise.race()

Promise.race()方法接收一個數組。

該數組一般也都由Promise組成。返回值為第一個改變狀態的Promise。

當數組元素為非Promise結構時,該非Promise結構會被視為成功的Promise并返回。

        let p1 = Promise.resolve(1);let p2 = null;let p3 = Promise.reject(3);let p4 = new Promise((resolve,reject)=>{resolve('ok');});let p5 = new Promise((resolve,reject)=>{reject('reject');})let a = Promise.race([p2,p1]);

Promise.catch()

Promise.catch()的語法有點像語法糖。

Promise.catch(reject)從語法上講,相當于promise.then(null, reject),這里的reject都是指處理reject狀態的回調函數。

.catch返回值也是一個Promise。

Promise.finally()

Promise.finally()方法,不論Promise的狀態是成功還是失敗,在最后都會調用finally中的方法。

finally可以用于處理不論返回結果如何,都需要執行的邏輯,可以避免代碼冗余。

finally接收的是一個函數。

finally的返回值是一個新的Promise實例對象。

該對象的狀態一般是父Promise狀態的傳遞。父Promise是指promise.finally中,promise對應的實例。但當finally的返回值是顯式reject或pending Promise時,返回值是reject或pending。

下例中,pTest的返回值是一個狀態為失敗的Promise,調用pTest時,雖然finally參數的返回值是成功的promise,但是由于該promise的狀態不是失敗或待定,所以finally的返回值取決于父Promise,即pTest。

        let pTest = new Promise((resolve,reject)=>{reject('error');});console.log(pTest.finally( ()=>{return new Promise((resolve,reject)=>{resolve('ok');})}));

但若finally參數返回的是reject或者pending,則返回值取決于參數。

參數返回reject的情況下:

        let pTest = new Promise((resolve,reject)=>{reject('error');});console.log(pTest.finally( ()=>{return new Promise((resolve,reject)=>{reject('reject');})}));

參數返回panding的情況下:

        let pTest = new Promise((resolve,reject)=>{reject('error');});console.log(pTest.finally( ()=>{return new Promise((resolve,reject)=>{})}));

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

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

相關文章

用TensorFlow進行邏輯回歸(六)

import tensorflow as tfimport numpy as npfrom tensorflow.keras.datasets import mnistimport time# MNIST數據集參數num_classes 10 # 數字0到9, 10類num_features 784 # 28*28# 訓練參數learning_rate 0.01training_steps 1000batch_size 256display_step 50# 預處…

【HTTP版本演變】

在瀏覽器中輸入URL并按回車之后會發生什么1. 輸入URL并解析輸入URL后,瀏覽器會解析出協議、主機、端口、路徑等信息,并構造一個HTTP請求(瀏覽器會根據請求頭判斷是否又HTTP緩存,并根據是否有緩存決定從服務器獲取資源還是使用緩存…

Android 16系統源碼_窗口動畫(一)窗口過渡動畫層級圖分析

一 窗口過渡動畫 1.1 案例效果圖1.2 案例源碼 1.2.1 添加權限 (AndroidManifest.xml) <!-- 系統懸浮窗權限&#xff08;Android 6.0需動態請求&#xff09; --> <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />1.2.2 窗口顯示…

騰訊云WAF域名分級防護實戰筆記

基于業務風險等級、合規要求及騰訊云最佳實踐&#xff0c;提供可直接落地的配置方案&#xff0c;供學習借鑒&#xff1a;一、域名分級與防護原則1. ?域名分級清單&#xff08;核心資產&#xff09;???主域名??業務類型??風險等級??合規要求??防護等級?example.com…

1. 請說出你知道的水平垂直居中的方法

總結 容器 flex 布局&#xff0c;jsutify-content: center; align-items: center;容器 flex 布局&#xff0c;子項 margin: auto;容器 relative 布局&#xff0c;子項 absolute 布局&#xff0c;left: 50%; top: 50%; transform: translate(-50%, -50%);子項 absolute 布局&…

VS Code `launch.json` 完整配置指南:參數詳解 + 配置實例

文章目錄&#x1f4e6; 一、基本結構&#x1f50d; 二、單個配置項詳解示例配置&#xff1a;&#x1f9e9; 三、字段說明與可選值&#x1f4c1; 四、常用變量&#xff08;宏替換&#xff09;&#x1f6e0;? 五、常見配置實例1?? 調試當前打開的 .py 文件2?? 調試 Jupyter …

使用瀏覽器inspect調試wx小程序

edge://inspect/#devices調試wx小程序 背景&#xff1a; 在開發混合項目的過程中&#xff0c;常常需要在app環境排查問題&#xff0c;接口可以使用fiddler等工具來抓包&#xff0c;但是js錯誤就不好抓包了&#xff0c;這里介紹一種調試工具-瀏覽器。 調試過程 首先電腦打開edg…

【論文閱讀】-《Simple Black-box Adversarial Attacks》

簡單黑盒對抗攻擊 Chuan Guo Jacob R. Gardner Yurong You Andrew Gordon Wilson Kilian Q. Weinberger 摘要 我們提出了一種在黑盒&#xff08;black-box&#xff09;場景下構建對抗樣本&#xff08;adversarial images&#xff09;的極其簡單的方法。與白盒&#xff08;…

基于ASP.NET+SQL Server實現(Web)企業進銷存管理系統

企業進銷存管理系統的設計和實現一、摘要進銷存管理是現代企業生產經營中的重要環節&#xff0c;是完成企業資源配置的重要管理工作&#xff0c;對企業生產經營效率的最大化發揮著重要作用。本文以我國中小企業的進銷存管理為研究對象&#xff0c;描述了企業進銷存管理系統從需…

(LeetCode 面試經典 150 題 ) 15. 三數之和 (排序+雙指針)

題目&#xff1a;15. 三數之和 思路&#xff1a;排序雙指針&#xff0c;時間復雜度0(n^2nlogn)。 先將數組nums升序排序&#xff0c;方便去重和使用雙指針。第一層for循環來枚舉第一位數&#xff0c;后面使用雙指針來找到第二個、第三個數即可&#xff0c;細節看注釋。 C版本…

easy-springdoc

介紹 簡化springdoc的使用&#xff08;可以搭配knife4j-openapi3-jakarta-spring-boot-starter一起使用&#xff09; maven引用 <dependency><groupId>io.github.xiaoyudeguang</groupId><artifactId>easy-springdoc</artifactId><version>…

配置nodejs,若依

1.配置node.js環境 Node.js — Download Node.js 1.下載好一路下一步&#xff0c;可以安裝到d盤 裝完之后執行 npm -v 顯示版本號即安裝成功 2.安裝好后新建兩個文件夾&#xff0c;node_cache和node_global 3.配置環境變量 新建變量 在path里編輯變量 4.配置用戶變量 5.…

Python學習之路(十二)-開發和優化處理大數據量接口

文章目錄一、接口設計原則二、性能優化策略1. 數據庫優化2. 緩存機制3. 并發模型三、內存管理技巧1. 內存優化實踐2. 避免內存泄漏四、接口測試與監控1. 性能測試2. 日志與監控3. 錯誤處理與限流五、代碼示例&#xff08;Flask 流式處理&#xff09;六、部署建議一、接口設計原…

【實時Linux實戰系列】實時數據流的網絡傳輸

在實時系統中&#xff0c;數據流的實時傳輸是許多應用場景的核心需求之一。無論是工業自動化中的傳感器數據、金融交易中的高頻數據&#xff0c;還是多媒體應用中的視頻流&#xff0c;都需要在嚴格的時間約束內完成數據的傳輸。實時數據流的傳輸不僅要求高吞吐量&#xff0c;還…

C#數組(一維數組、多維數組、交錯數組、參數數組)

在 C# 中&#xff0c;數組是一種用于存儲固定大小的相同類型元素的集合。數組可以包含值類型、引用類型或對象類型的元素&#xff0c;并且在內存中是連續存儲的。以下是關于 C# 數組的詳細介紹&#xff1a;1. 一維數組聲明與初始化// 聲明數組 int[] numbers; // 聲…

Dify離線安裝包-集成全部插件、模板和依賴組件,方便安可內網使用

項目介紹 Dify一鍵離線安裝包&#xff0c;集成安裝了全部插件、模板&#xff0c;并集成了dify全部插件所需的依賴組件。方便你在內網、安可環境等離線狀態下使用。 Dify是一個開源的LLM應用開發平臺。其直觀的界面結合了AI工作流、RAG管道、Agent、模型管理、可觀測性功能等&…

面試150 翻轉二叉樹

思路 采用先序遍歷&#xff0c;可以通過新建根節點node&#xff0c;將原來root的右子樹連到去node的左子樹中&#xff0c;root的左子樹連到去node的右子樹中。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): …

C++-linux系統編程 3.gcc編譯工具

GCC編譯工具鏈完全指南 GCC&#xff08;GNU Compiler Collection&#xff09;是Linux系統下最常用的編譯器套件&#xff0c;支持C、C、Objective-C等多種編程語言。本章將深入講解GCC的編譯流程、常用選項及項目實戰技巧。 一、GCC編譯的四個核心階段 GCC編譯一個程序需要經過四…

uView UI 組件大全

uView UI 是一個基于 uni-app 的高質量 UI 組件庫&#xff0c;提供豐富的跨平臺組件&#xff08;支持 H5、小程序、App 等&#xff09;。以下是其核心組件的分類大全及功能說明&#xff0c;結合最新版本&#xff08;1.2.10&#xff09;整理&#xff1a; &#x1f4e6; 一、基礎…

QWidget 和 QML 的本質和使用上的區別

QWidget 和 QML 是 Qt 框架中兩種不同的 UI 開發技術&#xff0c;它們在底層實現、設計理念和使用場景上有顯著區別。以下是它們的本質和主要差異&#xff1a;1. 本質區別特性QWidgetQML (Qt Modeling Language)技術基礎基于 C 的面向對象控件庫基于聲明式語言&#xff08;類似…