面試總結:Promise有關面試的知識點。
Promise是為了解決非同步程式設計出現的地獄回撥問題而提出來的。
Promise的優點與缺點:
優點:Promise其實就是做了一件事情,它是對非同步操縱進行了封裝,然後可以將非同步操縱以同步的流程表達出來,避免了層層巢狀的回撥函式,同時提供了同一的介面,使得控制非同步操縱更加容易。
缺點:1.無法取消Promise,一旦被建立它就會立刻去執行,無法中途取消
2.如果不設定回撥函式,Promise內部的錯誤無法反應到外部
3.當處於未完成狀態時,無法得知目前進行到那個狀態。
初識Promise
var p=new Promise(function (resolve,rejecct) {
if(/*非同步操縱成功*/) {
resolve(res)
}else {
reject(error)
}
})
p.then(function (value) {
//完成態
},function (error) {
//失敗態
})
我們在通過Promise建構函式例項化一個物件時,會傳遞一個函式作為引數,這個函式會立即執行。
在Promise中,對一個非同步操縱做出了抽象的定義,Promise操縱只會處 在3種狀態中的一種
即未完成態-->完成態,未完成態-->失敗態。注意:狀態一旦轉化就不能更改。
只有非同步操作才可以決定當前是那種狀態,任何其他操作都無法改變這個狀態。
在宣告一個Promise例項時,我們傳入的匿名函式引數中:
resolve:代表成功態之後的操縱
reject:代表失敗態之後的操縱
我們在呼叫物件例項then()方法傳遞的兩個引數中:
第一個引數(函式)對應著完成態的操作,也就是resolve
第二個引數(函式)對應著失敗態的操作,也就是reject
也就是說在Promise中通過then()方法 來指定處理非同步操作結果的方法
Promise進階
resolve/reject引數
reject函式的引數一般來說是Error物件例項,而resolve函式的引數除了正常值外,還有可能是另一個Promise例項,表示非同步操作的結果有可能是一個值,也有可能是另一個非同步操作
console.time('Promise example start')
var p1 = new Promise( (resolve, reject) => {
setTimeout(() => resolve('hi'), 3000);
});
var p2 = new Promise( (resolve, reject) => {
setTimeout(() => resolve(p1), 10);
});
p2.then( ret => {
console.log(ret);
console.timeEnd('Promise example end')
});
p2會等待p1的執行結果,然後再執行,從輸出hi可以看到p1完成狀態轉變之後,傳遞給resolve(或者reject)的結果會傳遞給p2中的resolve
。
then()
then()方法是Promise例項的方法,即Promise.prototype上的,它的作用是為Promise例項物件新增狀態改變時的回撥函式
第一個引數是resolve狀態的回撥函式,第二個引數是reject狀態的回撥函式。then()方法會返回一個新的Promise例項,這樣就可以使用鏈式操縱了。還有一點,就是鏈式中的then方法(從第二個開始),它們resolve中的引數是前一個then()當中resolve的return語句的返回值
catch()錯誤處理
catch方法是Promise例項的方法,即Promise.prototype上的屬性,它其實就是.then(null,rejection)的簡寫,用於指定錯誤時的回撥函式。Promise物件的Error物件具有冒泡的性質,會一直向後傳遞直到被捕獲為止。也就是說錯誤總會被下一個catch語句所捕獲。因為有了這種方便的錯誤處理機制,所以一般不要在then()方法中定義reject狀態的回撥函式,而是使用catch方法來捕獲錯誤。
catch的返回值,它返回的是一個Promise物件,因此還可以其後面呼叫then()方法。當出錯時,catch會先處理之前的錯誤,然後通過return把值返回給下一個then()方法之中。如果沒有錯,就直接跳過catch()方法
Promise物件方法
Promise.all()方法將多個promise例項,包裝成一個新的promise例項
如:var p=Promise.all([p1,p2,p3])
新的Promise例項p的狀態是由p1,p2,p3來決定
當p1,p2,p3都為完成態時,p為完成態
當p1,p2,p3任意一個為失敗態時,p為失敗態
Promise.race()方法也是將多個promise例項,包裝成一個新的promise例項。它的狀態只要p1, p2, p3
中任意一個例項率先改變狀態,則p
的狀態就跟著改變,而且狀態由率先改變的例項決定。
詳細的講解見:https://segmentfault.com/a/1190000007685095
相關文章
- java面試知識點總結Java面試
- CSS知識點面試總結CSS面試
- Java 面試知識點總結Java面試
- 關於 SSH 框架面試知識點的總結框架面試
- Redis知識點&面試題總結Redis面試題
- 前端知識點總結—面試專用前端面試
- Java基礎面試知識點總結Java面試
- 常見Java面試知識點總結Java面試
- 30道CSS 面試知識點總結CSS面試
- 2021-PHP面試題“資料庫“相關知識點面試大全總結PHP面試題資料庫
- 面試知識點面試
- Java集合類常見面試知識點總結Java面試
- MySQL 鎖常見知識點&面試題總結MySql面試題
- 《MySQL重要知識點及面試總結》:推薦收藏MySql面試
- 前端經典的JavaScript面試知識總結前端JavaScript面試
- 面試必知的web知識點面試Web
- 面試系列之View相關知識點面試View
- 面試需要掌握的知識點面試
- 設計模式常見面試知識點總結(Java版)設計模式面試Java
- JVM面試知識點梳理JVM面試
- jQuery面試知識點整理jQuery面試
- React Native面試知識點React Native面試
- Java面試指北!13個認證授權常見面試題/知識點總結!| JavaGuideJava面試題GUIIDE
- Java面試知識總結(一)-- 網路基礎Java面試
- 面試總結:鵝廠Linux後臺開發面試筆試C++知識點參考筆記面試Linux筆試C++筆記
- 高階 Java 面試通關知識點整理Java面試
- 自己整理的php面試知識點PHP面試
- SDWebImage面試常問點知識點Web面試
- css&html面試知識點CSSHTML面試
- Java 基礎面試知識點Java面試
- Flutter 面試知識點集錦Flutter面試
- Kafka面試知識點深度剖析Kafka面試
- Redis 面試必備知識點Redis面試
- JAVA高階面試必過知識點彙總Java面試
- 面試題總結:可能是全網最好的MySQL重要知識點面試題MySql
- [ Java面試題 ]Java 開發崗面試知識點解析Java面試題
- Linux命令有哪些知識點需要掌握?面試題Linux面試題
- 筆試題知識點總結筆試