要了解一個東西,首先要從,它是什么、用來做什么以及怎么取用它這三個方面來了解。
- 首先,promise是什么?
我們來參考一下MDN對它的定義:
Promise 對象用於一個異步操作的最終完成(或失敗)及其結果值的表示。(簡單點說就是處理異步請求。我們經常會做些承諾,如果我贏了你就嫁給我,如果輸了我就嫁給你之類的諾言。這就是promise的中文含義:諾言,一個成功,一個失敗。)
可以看到,promise是一個對象,用來處理異步操作,那么我們又要了解一下什么是同步異步,以下是我對同步異步的理解:
異步:被請求人的消息通知機制,即當被請求者在接收到請求之后,處理請求,處理完成后是否通知請求者的消息通知機制。
同步:請求者的事務處理機制,即當請求者發出請求后,是否等待請求結果,繼續處理接下來的事務。
總結promise是什么:
promise是一個構造函數,用來處理javascript中的異步操作。
- promise用來做什么?
在MDN的定義中已經給出答案,它用來處理異步操作,即維護事件處理的狀態,方便我們對異步操作獲取更直觀的感受,就是在一個事件處理的過程中,監聽事件處理的狀態成功與否,然后由這些狀態決定下一步操作。
MDN中對promise有這樣的描述:
Promise 對象是一個代理對象(代理一個值),被代理的值在Promise對象創建時可能是未知的。它允許你為異步操作的成功和失敗分別綁定相應的處理方法(handlers)。 這讓異步方法可以像同步方法那樣返回值,但並不是立即返回最終執行結果,而是一個能代表未來出現的結果的promise對象
引用阮一峰ES6中的一句話介紹promise能為我們做什么,以及有什么缺點:
有了Promise對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise對象提供統一的接口,使得控制異步操作更加容易。
首先,無法取消Promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設置回調函數,Promise內部拋出的錯誤,不會反應到外部。第三,當處於pending狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。
- 基本用法
Promise是一個構造函數,用來生成Promise實例:
var promise= new Promise(function(resolve,reject){
//執行一些代碼
if(如果異步操作成功){
resolve(value)
}else{
//異步操作失敗
reject(error)
}
})
Promise對象通過維護三種狀態來實現異步操作,這三種狀態分別是:
- pending:初始值,不是成功或失敗狀態
- fulfilled :成功狀態
- rejected :操作失敗狀態
在以上實例構建過程中:Promise在構建實例的過程總接受一個函數作為參數,這個函數又擁有兩個函數作為參數(resolve,reject),分別代表着:
- resolve函數的作用是將Promise對象的狀態從“未完成”變為“成功”狀態,在異步操作成功時調用,器參數為異步操作返回出的結果。
- reject函數的作用則剛好相反,是將Promise對象的狀態從“未完成”狀態改變為“失敗”狀態,在異步操作失敗時調用,其參數為異步操作失敗返回的錯誤信息。
Promise中的常用API
- then
作用:Promise對象根據異步操作結果,執行相應的回調函數,接受兩個回調函數作為參數,第一個為Promise對象狀態改變為resolved時調用,第二個回調函數為Promise對象狀態改變為reject時調用,第二個參數是可選的,不是必須的,這兩個函數都接受Promise傳出的值作為參數。 - catch
作用:該方法是Promise.prototype.catch方法是.then(null, rejection)的別名,用於指定發生錯誤時的回調函數。 - all
作用:該方法用於將多個Promise實例包裝成一個新的實例
var promise=Promise.all([p1,p2,p3])
//該方法接受一個數組作為參數,數組中p1,p2,p3均為promise實例,只有當數組中的promise對象的狀態全部為"成功"狀態時,promise的狀態才會變為成功狀態,並將三個數組中的promise對象返回的結果,按照參數的順序傳遞給promise的回調函數。