面試總結: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
相關文章
- 關於 SSH 框架面試知識點的總結框架面試
- CSS知識點面試總結CSS面試
- java面試知識點總結Java面試
- Java 面試知識點總結Java面試
- Redis知識點&面試題總結Redis面試題
- Java基礎面試知識點總結Java面試
- 前端知識點總結—面試專用前端面試
- 30道CSS 面試知識點總結CSS面試
- 常見Java面試知識點總結Java面試
- iOS基礎面試知識點總結iOS面試
- 面試開發常用的 JavaScript 知識點總結面試JavaScript
- Java集合類常見面試知識點總結Java面試
- MySQL 鎖常見知識點&面試題總結MySql面試題
- 2021-PHP面試題“資料庫“相關知識點面試大全總結PHP面試題資料庫
- ES6的Promise知識點總結Promise
- 面試知識點面試
- 《MySQL重要知識點及面試總結》:推薦收藏MySql面試
- 機器學習及深度學習的知識點及面試題總結機器學習深度學習面試題
- 前端經典的JavaScript面試知識總結前端JavaScript面試
- promise知識點小結Promise
- 設計模式常見面試知識點總結(Java版)設計模式面試Java
- 最新大廠資料湖面試題,知識點總結面試題
- 面試系列之View相關知識點面試View
- 面試必知的web知識點面試Web
- 一篇文章,全面總結Android面試知識點Android面試
- 面試需要掌握的知識點面試
- 高階 Java 面試通關知識點整理Java面試
- Java面試知識總結(一)-- 網路基礎Java面試
- 總結 MySQL 相關知識點MySql
- JVM相關知識點總結JVM
- JVM面試知識點梳理JVM面試
- jQuery面試知識點整理jQuery面試
- android 面試知識點Android面試
- 4W字的後端面試知識點總結(持續更新)後端面試
- 面試題總結:可能是全網最好的MySQL重要知識點面試題MySql
- JAVA高階面試必過知識點彙總Java面試
- Java面試指北!13個認證授權常見面試題/知識點總結!| JavaGuideJava面試題GUIIDE
- PHP物件相關知識點的總結PHP物件