【ES6.0】- Promise對象

【ES6.0】- Promise對象

文章目錄

  • 【ES6.0】- Promise對象
    • 一、概述
    • 二、Promise狀態
    • 三、Promise方法
      • 3.1 Promise.prototype.then方法:鏈式操作
      • 3.2 Promise.prototype.catch方法:捕捉錯誤
      • 3.3 Promise.race方法:捕捉錯誤
      • 3.4 Promise.any()
      • 3.5 Promise.all()
      • 3.6 Promise.allSettled()
    • 四、總結

一、概述

Promise是異步編程的一種解決方案,是一種javascript處理異步操作的一種常見方式。Promise是一種處理異步操作的設計模式,提供了一種更結構化,更可靠的方式來處理異步任務。

二、Promise狀態

Promise異步操作有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。除了異步操作的結果,任何其他操作都無法改變狀態。

Promise對象只有:從pending變為fulfilled和從penging變為rejected的狀態改變。只要處于fulfilled和rejected,狀態就不會再變為resolved (已定型)。

Promise狀態演示

const pm1=new Promise(function(resolve,reject){resolve('resolve1')resolve('resolve2')
})const pm2=new Promise(function(resolve,reject){resolve('resolve3')reject('reject1')
})pm1.then(function(value){console.log('pm1->then->value',value)  //resolve1
})pm2.then(function(value){console.log('pm2->then->value',value)  // resolve3
})

狀態的缺點:

無法取消Promise,一旦新建它就會立即執行,無法中途取消。如果不設置回調函數,Promise內部拋出的錯誤,不會反應到外部。當處于pending狀態時,無法得知目前進展到哪一個階段。

三、Promise方法

3.1 Promise.prototype.then方法:鏈式操作

Promise.prototype.then方法返回的是一個新的Promise對象,因此可以采用鏈式寫法:

const pm1=new Promise(function(resolve,reject){resolve('resolve-01')
})
pm.then(function(value){console.log(value)return value+'-02'
}).then(function(value){console.log(value)return value+'-03'
}).then(function(value){console.log(value)
})

輸出結果

resolve-01
resolve-01-02
resolve-01-02-03

上面的代碼使用then方法,依次指定了兩個回調函數。第一個回調函數完成以后,會將返回結果作為參數,傳入第二個回調函數,第二個回調函數完成以后,會把返回值作為參數出入給第三個回調函數;依次直至結束。

如果前一個回調函數返回的是Promise對象,這個時一個回調函數就會等待該Promise對象有了運行結果才進一步調用

const pmFun=(param)=>{return new Promise((resolve,reject)=>{setTimeout(()=>{if(param<100){resolve('輸入值<100,傳入值為:'+param)}else{reject('輸入值>100,傳入值為:'+param)}},2000)})
}
pmFun(50).then((resp)=>{console.log('then-1',resp)return pmFun(83)
}).then((resp)=>{console.log('then-2',resp)
})

輸出結果:

輸入值<100,傳入值為:50
輸入值<100,傳入值為:82

Promisei的這種設計使得嵌套的異步操作,可以被很容易得到改寫,從回調函數的“橫向發展”改為“向下發展”。

3.2 Promise.prototype.catch方法:捕捉錯誤

Promise.prototype.catch方法是Promise.prototype.then(null,rejection)的別名,用于指定發生錯誤時回調函數。

const pmFun=(param)=>{return new Promise((resolve,reject)=>{setTimeout(()=>{if(param<100){resolve('輸入值<100,傳入值為:'+param)}else{reject('輸入值>100,傳入值為:'+param)}},2000)})
}
pmFun(50).then((resp)=>{console.log('then-1',resp)return pmFun(83)
}).then((resp)=>{console.log('then-1',resp)
}).catch((resp)=>{console.log('catch',resp)
})

Promise對象的錯誤具有“冒泡”性質,會一直向后傳遞,直到被捕捉為止,也就是說,錯誤總是會被下一個catch語句捕捉。

3.3 Promise.race方法:捕捉錯誤

Promise.race()方法允許我們同時發起多個異步操作,并在其中一個操作解決(fulfilled)或拒絕(rejected)時得到結果。它的語法如下:

Promise.race([promise1,promise2,..])

其中,promise1,promise2等為Promise對象數組。新的Promise的狀態將與第一個解決或拒絕的Promise的狀態相同。

const p1=new Promise((resolve,reject)=>{setTimeout(resolve,2000,'one')
})
const p2=new Promise((resolve,reject)=>{setTimeout(resolve,1000,'two')
})
const p3=new Promise((resolve,reject)=>{setTimeout(resolve,3000,'three')
})
const p3=new Promise((resolve,reject)=>{setTimeout(resolve,3000,'three')
})
Promise.race([p1,p2,p3]).then((resp)=>{console.log('then',resp)
}).catch((resp)=>{console.log('catch',resp)
})

運行結果

then two

race函數返回一個Promise,它將與第一個傳遞的promise相同的完成方式被完成。它可以是完成(resolves),也可以是失敗(rejects),這要取決第一個完成的方式是兩個中的哪個。

如果傳的迭代是空的,則返回的 promise 將永遠等待。

如果迭代包含一個或多個非承諾值和/或已解決/拒絕的承諾,則 Promise.race 將解析為迭代中找到的第一個值。

race在遇見立即執行的reject時并沒有像any一樣繼續等待resolve的返回,而是直接返回了reject的內容。

3.4 Promise.any()

Promise.any()接收一個由Promise所組成的可迭代iterable對象,該方法會返回一個新的promise,一旦迭代對象內的任意一個promise變成了兌現狀態,那么由該方法所有返回的promise就會變成兌現狀態,并且它的兌現值就是可迭代對象內的首先兌現的promise的兌現值。

如果可迭代對象內的promise最終都沒有兌現(即所有 promise 都被拒絕了),,那么該方法所返回的 promise 就會變成拒絕狀態,并且它的拒因會是一個 AggregateError 實例,這是 Error 的子類,用于把單一的錯誤集合在一起。

const p1=new Promise((resolve,reject)=>{setTimeout(resolve,2000,'one')
})
const p2=new Promise((resolve,reject)=>{setTimeout(resolve,1000,'two')
})
const p3=new Promise((resolve,reject)=>{setTimeout(resolve,3000,'three')
})
const p4=new Promise((resolve,reject)=>{reject('P4->reject')
})
Promise.race([p1,p2,p3,p4]).then((resp)=>{console.log('then',resp)
}).catch((resp)=>{console.log('catch',resp)
})
tren,two

只要參數實例有一個變成fulfilled狀態,包裝實例就會變成fulfilled狀態;如果所有參數實例都變成rejected狀態,包裝實例就會變成rejected狀態。

Promise.any()Promise.race()方法很像,只有一點不同,就是Promise.any()不會因為某個Promise變成rejected狀態而結束,必須等到所有參數Promise變成rejected狀態才會結束。

3.5 Promise.all()

Promise.all()方法接收一個 Promise的iterable類型的輸入。并且只返回一個Promise實例,那個輸入的所有promise的resolve回調的結果是一個數組。

Promise的resolve回調執行是在所有輸入的promise的resolve回調都結束,或者輸入的iterable里沒有promise了的時候。

它的reject回調執行時,只要任何一個輸入的promise的reject回調執行或者執行或者輸入不合格的promise就會立即拋出錯誤,并且reject的是第一個拋出的錯誤信息。

var p1 = new Promise((resolve, reject) => {setTimeout(resolve, 1000, 'p1->one');
});
var p2 = new Promise((resolve, reject) => {setTimeout(resolve, 2000, 'p2->two');
});
var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 3000, 'p3->three');
});
var p4 = new Promise((resolve, reject) => {setTimeout(resolve, 4000, 'p4->four');
});
var p5 = new Promise((resolve, reject) => {reject('reject');
});Promise.all([p1, p2, p3, p4, p5]).then(values => {console.log(values);
}, reason => {console.log(reason)
});
then ['p1->one','p2->two','p3->three','p4->four']

Promise.all()主要應用需要所有異步任務都同時進行并且完成時可以使用all方法。

3.6 Promise.allSettled()

Promise.allSettled()方法返回一個在所有給定的promise都已經fulfilled或rejected后的pronise,并帶有一個對象數組,每個對象表示對應的promise結果。

當您有多個彼此不依賴的異步任務成功完成時,或者您總是想知道每個promise的結果時,通常使用它。

相比之下,Promise.all()更適合彼此相互依賴或者在其中任何一個reject時立即結束。

var p1 = new Promise((resolve, reject) => {setTimeout(resolve, 4000, 'p1->one');
});
var p2 = new Promise((resolve, reject) => {setTimeout(resolve, 3000, 'p2->two');
});
var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 2000, 'p3->three');
});
var p4 = new Promise((resolve, reject) => {setTimeout(resolve, 1000, 'p3->four');
});
var p5 = new Promise((resolve, reject) => {reject('p5->reject');
});Promise.allSettled([p1, p2, p3, p4, p5]).then(values => {console.log(values);
}, reason => {console.log(reason)
});
then [{status:'fulfilled',value:'p1->one'},{status:'fulfilled',value:'p2->two'},{status:'fulfilled',value:'p3->three'},{status:'fulfilled',value:'p4->four'},{status:'rejected',value:'p5->reject'}]

一旦所指定的 promises 集合中每一個 promise 已經完成,無論是成功的達成或被拒絕,未決議的 Promise將被異步完成。那時,所返回的 promise 的處理器將傳入一個數組作為輸入,該數組包含原始 promises 集中每個 promise 的結果。

對于每個結果對象,都有一個 status 字符串。如果它的值為 fulfilled,則結果對象上存在一個 value 。如果值為 rejected,則存在一個 reason 。value(或 reason )反映了每個 promise 決議(或拒絕)的值。

可以發現和all相比,allSettled在其中一個promise返回錯誤時還可以繼續等待結果。并且不管內部的計時器定時多少毫秒,它都會等所有結果返回后按照傳參傳入的順序返回promise結果。

四、總結

根據不同場景選擇 Promise.all、Promise.race、Promise.allSettled 和 Promise.any 四個方法合適的使用。

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

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

相關文章

第三節-Android10.0 Binder通信原理(三)-ServiceManager篇

1、概述 在Android中&#xff0c;系統提供的服務被包裝成一個個系統級service&#xff0c;這些service往往會在設備啟動之時添加進Android系統&#xff0c;當某個應用想要調用系統某個服務的功能時&#xff0c;往往是向系統發出請求&#xff0c;調用該服務的外部接口。在上一節…

廣告機/商業顯示屏_基于MT878安卓主板方案

安卓主板在廣告機領域扮演著重要的角色。無論是在商場、車站、酒店、電梯、機場還是高鐵站&#xff0c;LED廣告機廣泛應用&#xff0c;并通過不同方式進行播放和管理。 廣告機/商業顯示屏_基于MT878安卓主板方案 基于MT8788安卓主板方案的廣告機采用了聯發科MT8788八核芯片方案…

對比兩個數組中對應位置的兩個元素將每次對比的最大值用于構成新的數組np.maximum()

【小白從小學Python、C、Java】 【計算機等考500強證書考研】 【Python-數據分析】 對比兩個數組中對應位置的兩個元素 將每次對比的最大值用于構成新的數組 np.maximum() 選擇題 以下代碼的輸出結果為&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

Axios 默認配置 簡化URL 簡化代碼 多臺服務器接口配置

main.js配置 import Axios from axios Axios.defaults.method GET//設置默認的請求類型 Axios.defaults.baseURL https://apis.jxcxin.cn/api//設置接口地址 Axios.defaults.params { token: abc } //每次請求都帶上這個參數 Axios.defaults.timeout 5000 //請求的超時時間…

MATLAB - text的兩種使用方法

text小技巧 1. 常規使用&#xff08;Method 1&#xff09;2. 在顯示畫面的相對位置&#xff08;Method 2&#xff09;3. 舉個例子 1. 常規使用&#xff08;Method 1&#xff09; text(x,y,txt)2. 在顯示畫面的相對位置&#xff08;Method 2&#xff09; text(string,‘ABC’,…

使用websocket獲取thingsboard設備的實時數據

背景 有一個讀者前來咨詢,如何實時獲取設備的遙測數據。 其實tb是有提供websocket接口來獲取設備數據的。而且還支持js跨域調用。下面給大家演示一下。 websocket地址 完整代碼 <!DOCTYPE HTML> <html><h

HTTP協議和WebSocket協議之間的區別

HTTP協議和WebSocket協議之間的主要區別在于它們的設計目的和通信方式。 HTTP協議是一種無狀態的協議&#xff0c;它的主要設計目的是用于從Web服務器傳輸超文本到本地瀏覽器的傳輸協議。HTTP協議使用請求和響應模型&#xff0c;客戶端向服務器發送請求&#xff0c;服務器返回…

【Java并發編程十二】線程池

線程池 用來統一地管理線程&#xff0c;避免線程的重復創建與銷毀。使用線程池可以讓執行完的線程回到線程池&#xff0c;等待下一次調用。 import jdk.jshell.EvalException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import j…

Matplotlib顏色條的配置_Python數據分析與可視化

Matplotlib顏色條配置 基本顏色顏色條選擇配色方案顏色條刻度的限制與擴展功能的設置離散型顏色條 基本顏色 Matplotlib提供了8種指定顏色的方法&#xff1a; 在[0&#xff0c;1]中的浮點值的RGB或RGBA元組&#xff08;例如 (0.1, 0.2, 0.5) 或&#xff08;0.1&#xff0c; 0.…

C語言中文網 - Shell腳本 - 9

第1章 Shell基礎(開胃菜) 9. Shell修改命令提示符 Shell 通過PS1和PS2這兩個環境變量來控制提示符的格式,修改PS1和PS2的值就能修改命令提示符的格式。 PS1 控制最外層的命令提示符格式。 PS2 控制第二層的命令提示符格式。 在修改 PS1 和 PS2 之前,我們先用 echo 命令輸出…

contos7中mongodb數據庫無法備份與還原,數據庫工具的安裝

由于之前數據庫沒有卸載干凈&#xff0c;導致直接用sudo yum install -y mongodb-org-tools命令無法直接安裝&#xff0c;只能選擇手動安裝了。 先去官網找到mongo-tool工具 MongoDB Database Tools Downloads | MongoDB 然后復制要下載的版本的地址。 然后直接用wget來下載 …

【每日OJ —— 622. 設計循環隊列】

每日OJ —— 622. 設計循環隊列 1.題目&#xff1a;622. 設計循環隊列2.解法2.1.解法講解2.1.1.算法講解2.1.2.代碼實現2.1.3.提交通過展示 1.題目&#xff1a;622. 設計循環隊列 2.解法 1.本題有很多解法&#xff1a;可以使用數組&#xff0c;單鏈表&#xff0c;雙鏈表&#x…

2023亞太杯數學建模賽題人工精準翻譯

大家好&#xff0c;亞太杯今天早上6點已經開賽啦&#xff0c;然后我在這里給大家帶來賽題的精準人工翻譯&#xff0c;防止大家直接用軟件翻譯導致某些地方亂碼或者翻譯不精準&#xff0c;這會導致后續做題過程出現很大偏差。 注意&#xff0c;以下翻譯均免費發放word形式的哈&…

【精選】CSS入門必看知識點大合集

CSS簡介 CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;層疊樣式表&#xff0c;又叫級聯樣式表&#xff0c;簡稱樣式表 CSS文件后綴名為.css CSS用于HTML文檔中元素樣式的定義 為什么需要CSS 使用css的唯一目的就是讓網頁具有美觀一致的頁面 語法 CSS 規則…

DB2—03(DB2中常見基礎操作)

DB2—03&#xff08;DB2中常見基礎操作&#xff09; 1. 前言1.1 oracle和mysql相關 2. db2中的"dual"2.1 SYSIBM.SYSDUMMY12.2 使用VALUES2.3 SYSIBM.SYSDUMMY1 "變" dual 3. db2中常用函數3.1 nvl()、value()、COALESCE()3.2 NULLIF() 函數3.3 LISTAGG() …

論文《Unsupervised Dialog Structure Learning》筆記:詳解DD-VRNN

D-VRNN模型和DD-VRNN模型 總體架構 離散-可變循環變分自編碼器&#xff08;D-VRNN&#xff09;和直接-離散-可變循環變分自編碼器&#xff08;DD-VRNN&#xff09;概述。D-VRNN和DD-VRNN使用不同的先驗分布來建模 z t z_t zt?之間的轉換&#xff0c;如紅色實線所示。 x t x_t…

Rust錯誤處理:Result

文章目錄 簡介錯誤匹配 Rust基礎教程&#xff1a; 初步? 所有權? 結構體和枚舉類? 函數進階? 泛型和特征? 并發和線程通信? cargo包管理? 可空類型Option Rust進階教程&#xff1a; 用宏實現參數可變的函數? 類函數宏 簡介 Rust中沒有提供類似try…catch之類…

qt雙擊treeview節點之后,完成編輯,獲取完成編輯得信號

Qt 中&#xff0c;要獲取 QTreeView 節點完成編輯的信號&#xff0c;您可以使用 QTreeView 的 doubleClicked 信號以及重寫相應的編輯觸發函數。通常情況下&#xff0c;完成編輯后會觸發 closeEditor 信號。 以下是一個示例代碼&#xff0c;演示了如何實現這個功能&#xff1a…

【亞太杯思路助攻】2023年第十三屆APMCM亞太地區大學生數學建模競賽——(文末領取方式)

2023年第十三屆APMCM亞太地區大學生數學建模競賽——正式開賽&#xff01;&#xff01;&#xff01; 賽題已由高分雅思學姐翻譯完成&#xff0c;我們的O獎學長也在第一時間分析了賽題&#xff0c;幫助大家最快時間&#xff0c;選擇最適合是自己的賽題。 B題 C題 祝各位小伙伴都…