面試總結:Promise有關面試的知識點。

mrhuanhuan發表於2018-10-03

 

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

 

相關文章