關於Promise

来源:https://www.cnblogs.com/fengrenfan/archive/2019/03/16/10538454.html
-Advertisement-
Play Games

Promise是一部編程的一種解決方案, 簡單說就是一個容器,裡面保存著麽謳歌未來才會結束的事件(通常是一個非同步操作)的結果 是為了簡化非同步對象,解決地獄回掉情況 Promise:有兩個回調函數:resolve:將對象的狀態從未完成變成成功 :reject:將對象的狀態從未完成變成失敗 下麵的代碼是 ...


Promise是一部編程的一種解決方案,

簡單說就是一個容器,裡面保存著麽謳歌未來才會結束的事件(通常是一個非同步操作)的結果

是為了簡化非同步對象,解決地獄回掉情況

Promise:有兩個回調函數:resolve:將對象的狀態從未完成變成成功

           :reject:將對象的狀態從未完成變成失敗

 

下麵的代碼是展示一個Promise的簡單非同步調用:

            var p = new Promise(function(resolve,reject){
                //做一些非同步操作
                setTimeout(function(){
                    console.log("執行完畢!");
                    resolve("成功!");
                },2000);
            });
            //調用
            p.then(function(add){
                console.log(add);
            });

 

下麵是封裝一個簡單的Promise:

function pro(){
                let p = new Promise(resolve,reject){
                    setTimeout(function(){
                        console.log("執行完畢!");
                        resolve("成功!");
                    },2000);
                } 
                return p;
            }
            pro().then(function(data){
                console.log(data);
            })

then:可以接受兩個回掉函數作為參數,(成功回調)和(失敗回調),其中失敗回調可選,這兩個參數都接受Promise傳出的值作為參數

resolve的用法把Promise的狀態置為rejected,這樣就能在then中捕獲到,然後執行 “失敗” 情況的回調

            function getName(){
                var p = new Promise(function(resolve,reject){
                    setTimeout(function(){
                        var num = Math.ceil(Math.random()*10);
                        if(num>5){
                            resolve(num);
                        }else{
                            reject("數字大於5了!");
                        }
                    },2000);
                })
                return p;
            };
            getName().then(function(data){
                console.log(resolve);
                console.log(data);
            },function(reject,data){
                console.log(reject);
                console.log(data);
            });

 

Promise.catch()方法是捕獲錯誤的,用於指定發生錯誤時的回調函數

下麵的一段代碼:

primose.then(val=>{
                console.log("成功",val);
            }).catch(err=>{
                console.log("失敗",err);
            })

Promise。all()    吧Promise打包,扔到一個數組裡面。打包完還是一個Promise對象,必須確保所有的Promise對象,都是resolve對象,都是成功的狀態

即:將多個Promise實例,包裝才能一個新的Promise實例

var P = new Promise([p1,p2,p3]);

Promise.all()方法接受一個數組作為參數,p1,,p2,p3都是Promise對象的實例,如果不是就會 先調用Promise的resolve方法,將參數轉換化Promise實例,在進一步處理

(改方法參數可以不是數組,但是必須具有iterator,且返回的每個成員都是Promise實例)

Promise.race() 同樣是將多個Promise實例,包裝成一個新的Promise實例

var P = new Promise([p1,p2,p3]);

上面的代碼中p1,p2,p3,三個中有一個實例率先改變狀態,P的狀態就會跟著改變

跟上面你的Promise.all()一樣,如果不是Promise實例,就會調用Promise的resolve

            let fun1=()=>{
                return new Promise((resolve,reject)=>{
                    console.log("執行了方法1");
                });
            }
            let fun2=()=>{
                return new Promise((resolve,reject)=>{
                    console.log("執行了方法2");
                })
            }
            let fun3=()=>{
                return new Promise((resolve,reject)=>{
                    console.log("執行了方法3");
                })
            }
            const arr = [fun1(),fun2(),fun3()];
            Promise.all(arr).then(()=>{
                console.log("全部執行完畢!");
                //console.log(data)["執行了方法1","執行了方法2","執行了方法3",]
            });//如果三個方法裡面的任何一個改變狀態為reject,則報錯

Promise.race(iterable) 方法返回一個 promise,一旦迭代器中的某個promise解決或拒絕,返回的 promise就會解決或拒絕。

var promise1 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 500, 'one');
});

var promise2 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(function(value) {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是事務 事務(Transaction),一般是指要做的或所做的事情。資料庫中事務是指多個sql語句,要麼全部執行成功,要麼全部執行失敗。 begin; # 開始事務 commit; # 提交事務 rollback; # 回滾 四個特性,ACID 原子性(Atomicity):事務作為一個整體被執 ...
  • 一個數據表,需要兩個欄位聯合起來一塊做主鍵的時候。舉例如下: 直接用sql語句的話如下 或者在phpmyadmin中操作,如下圖: 完成後,這時候插入數據就會發現,a_id和b_id組合來看,數據有重覆會提示插入錯誤的 設置後,我又後悔了,要取消數據表的主鍵,sql語句如下: ...
  • Gradle sync failed: Unable to start the daemon process. ...
  • 文章大綱 一、屏幕適配是什麼二、 重要概念講解三、屏幕適配實戰四、項目源碼下載 一、屏幕適配是什麼 Android中屏幕適配就是通過對尺寸單位、圖片、文字、佈局這四種類型的資源進行合理的設計和規劃,在佈局時合理利用各種類型的資源,讓佈局擁有適應能力,能在各種設備下保持良好的展現效果。 二、常見屏幕適 ...
  • Android values資源是Xml格式的文件 上圖定義了顏色(colors)字元串(strings)樣式(style)三個資源文件 xml文件寫在resources標簽里 在安卓中引用資源 ...
  • Java的代碼 主要重點: findViewById(); OnClickListener() xml文件主要是設計手機界面(UI) 重點:控制項的運用 (Button TextView)以及屬性的設置 app界面如圖 ...
  • html標簽中有沒有什麼自帶的屬性可以存儲成績的 沒有 本身html標簽沒有這個屬性,自己(程式員)添加的, 自定義屬性 為了存儲一些數據 在html標簽中添加的自定義屬性,如果想要獲取這個屬性的值,需要使用getAttribute("自定義屬性的名字")才能獲取這個屬性的值 使用方法: 設置自定義 ...
  • 我安裝webpack時,出現如下錯誤: C:\Users\admin> npm install webpack -gnpm WARN checkPermissions Missing write access to C:\Users\admin\AppData\Roaming\npm\node_mo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...