-
Promise物件的特點
-
物件不受外界影響
-
一旦狀態改變,就不會再變
-
Promise返回的永遠是一個Promise物件,傳遞值只能通過resolve和reject
-
注意,呼叫
resolve
或reject
並不會終結 Promise 的引數函式的執行。new Promise((resolve, reject) => { resolve(1); console.log(2); }).then(r => { console.log(r); }); // 2 // 1 複製程式碼
-
所以正確最好這麼寫:
new Promise((resolve, reject) => { return resolve(1); // 後面的語句不會執行 console.log(2); }) 複製程式碼
-
-
完整呼叫形式
function p(){ return new Promise((resolve,reject) =>{ // todo }).then(result =>{ console.log(result) },reject =>{ console.log('reject'+reject) }).catch(e){ // to catch error } } 複製程式碼
-
關於then,catch:他們都返回promise物件,因為所有的promise返回的都是一個promise,所以promise才可以鏈式呼叫。
-
Then方法:
- Promise 例項具有
then
方法,也就是說,then
方法是定義在原型物件Promise.prototype
上的。 then
方法返回的是一個新的Promise
例項(注意,不是原來那個Promise
例項)。因此可以採用鏈式寫法,即then
方法後面再呼叫另一個then
方法。then
方法可以接受兩個回撥函式作為引數。第一個回撥函式是Promise
物件的狀態變為resolved
時呼叫,第二個回撥函式是Promise
物件的狀態變為rejected
時呼叫。其中,第二個函式是可選的,不一定要提供。這兩個函式都接受Promise
物件傳出的值作為引數。- 如果呼叫
resolve
函式和reject
函式時帶有引數,那麼它們的引數會被傳遞給then中的回撥函式。reject
函式的引數通常是Error
物件的例項,表示丟擲的錯誤;resolve
函式的引數除了正常的值以外,還可能是另一個 Promise 例項,比如像下面這樣。
- Promise 例項具有
-
Catch方法
-
Promise.prototype.catch
方法是.then(null, rejection)
的別名,用於指定發生錯誤時的回撥函式。 -
Promise 物件的錯誤具有“冒泡”性質,會一直向後傳遞,直到被捕獲為止。也就是說,錯誤總是會被下一個
catch
語句捕獲。-
所以不要在then方法裡面定義 Reject 狀態的回撥函式(即then的第二個引數),而是在Promise呼叫鏈的結尾使用catch方法。
// bad promise .then(function(data) { // success }, function(err) { // error }); // good promise .then(function(data) { //cb // success }) .catch(function(err) { // error }); 複製程式碼
-
-
跟傳統的
try/catch
程式碼塊不同的是,如果沒有使用catch
方法指定錯誤處理的回撥函式,Promise 物件丟擲的錯誤不會傳遞到外層程式碼,即不會有任何反應。但是在Node裡有一個unhandledRejection
事件,專門監聽未捕獲的reject
錯誤process.on('unhandledRejection', function (err, p) { throw err; }); 複製程式碼
- 注意,Node 有計劃在未來廢除
unhandledRejection
事件。如果 Promise 內部有未捕獲的錯誤,會直接終止程式,並且程式的退出碼不為 0。
- 注意,Node 有計劃在未來廢除
-
-
Promise.all([這是若干個promise組成的陣列])
-
const p = Promise.all([p1, p2, p3]); 複製程式碼
-
Promise.all
方法接受一個陣列作為引數,p1
、p2
、p3
都是 Promise 例項,如果不是,就會先呼叫下面講到的Promise.resolve
方法,將引數轉為 Promise 例項,再進一步處理。(Promise.all
方法的引數可以不是陣列,但必須具有 Iterator(遍歷) 介面,且返回的每個成員都是 Promise 例項。) -
只有
p1
、p2
、p3
的狀態都變成fulfilled
,p
的狀態才會變成fulfilled
,此時p1
、p2
、p3
的返回值組成一個陣列,傳遞給p
的回撥函式。只要
p1
、p2
、p3
之中有一個被rejected
,p
的狀態就變成rejected
,此時第一個被reject
的例項的返回值,會傳遞給p
的回撥函式。
-
-
Promise.race()
- 其實和Promise.all()差不多,就是p1,p2,p3有一個狀態變成resolve,p就變成resolve然後傳遞值
-
Promise.resolve()
-
有時需要將現有物件轉為 Promise 物件,
Promise.resolve
方法就起到這個作用。這個方法的引數分為4中情況-
引數是一個 Promise 例項
- 直接返回
-
引數是一個thenable物件,指的是具有
then
方法的物件,比如下面這個物件。let thenable = { then: function(resolve, reject) { resolve(42); } }; // Promise.resolve方法會將這個物件轉為 Promise 物件 // 然後就立即執行thenable物件的then方法。 //上面程式碼中,thenable物件的then方法執行後,物件p1的狀態就變為resolved // 從而立即執行最後那個then方法指定的回撥函式,輸出 42。 複製程式碼
-
引數不是具有then方法的物件,或根本就不是物件
-
如果引數是一個原始值,或者是一個不具有
then
方法的物件,則Promise.resolve
方法返回一個新的 Promise 物件,狀態為resolved
。const p = Promise.resolve('Hello'); p.then(function (s){ console.log(s) }); // Hello //上面程式碼生成一個新的 Promise 物件的例項p。由於字串Hello不屬於非同步操作(判斷方法是字串物件不具有 then 方法),返回 Promise 例項的狀態從一生成就是resolved,所以回撥函式會立即執行。Promise.resolve方法的引數,會同時傳給回撥函式。 複製程式碼
-
-
不帶有任何引數:
Promise.resolve
方法允許呼叫時不帶引數,直接返回一個resolved
狀態的 Promise 物件。
-
-
所以,如果希望得到一個 Promise 物件,比較方便的方法就是直接呼叫
Promise.resolve
方法。
-
-
Promise.reject()和resolve()方法
-
Generator函式與Promise的結合
- 大概意思就是在我們使用generator的時候,遇到yield一個非同步操作,一般返回的是promise物件
一文講明白Promise
相關文章
- Promise 你真的用明白了麼?Promise
- Python函式每日一講 - 一文讓你徹底明白hasattr函式的使用Python函式
- Python函式每日一講 - 一文徹底讓你明白hash函式的使用Python函式
- Promise原理講解 && 實現一個Promise物件 (遵循Promise/A+規範)Promise物件
- 一文講明白Java中執行緒與程序、併發與並行、同步與非同步Java執行緒並行非同步
- ES6 Promise 用法講解Promise
- Linux核心版本控制方案給你講明白Linux
- 【前端】一文徹底學會Promise前端Promise
- 一文了解Promise使用與實現Promise
- 一文讓你明白Redis持久化(RDB、AOF)Redis持久化
- 讓你從頭到尾把promise整的明明白白Promise
- 講給小白聽的Promise原理剖析Promise
- ES6 Promise 用法講解(轉)Promise
- 一文讓你明白 Git 分支是如何工作的Git
- 終於有人把網路爬蟲講明白了爬蟲
- 這麼講執行緒池,徹底明白了!執行緒
- 終於有人把隱私計算講明白了
- 終於有人把Web 3.0和元宇宙講明白了Web元宇宙
- ClickHouse與Hive的區別,終於有人講明白了Hive
- 一文講透Modbus協議協議
- 一文搞明白位運算、補碼、反碼、原碼
- 一文看明白誰才是Node.js的優秀框架Node.js框架
- 終於有人把工業資料採集講明白了
- 終於有人把能把資料採集給講明白了
- 一文講透Java序列化Java
- 一文講透主資料管理
- 一文帶你懟明白程式和執行緒通訊原理執行緒
- 數字化轉型的組成要素,一篇講明白!
- 這樣講 SpringBoot 自動配置原理,你應該能明白了吧Spring Boot
- 大資料基礎架構Hadoop,終於有人講明白了大資料架構Hadoop
- MPP大資料系統架構,終於有人講明白了大資料架構
- 終於有人把BungeeCord群組服搭建教程方法講明白了
- 通俗講明白機器學習中的學習問題 - svpino機器學習
- 一文講清HBase儲存結構
- 一文講清楚FusionInsight MRS CDL如何使用
- 11行虛擬碼給你講明白什麼是演算法演算法
- 終於有人能把c#樂娛LEY介面的作用講明白了C#
- 資料視覺化的設計技巧,終於有人講明白了!視覺化