pormise是js的非同步程式設計的一種解決方案,在es6將其寫進了語言標準,提供了原生的promise物件。
promise簡單來理解就是乙個容器,裡面存放著某個未來才會結束的事件結果。promise是乙個物件,從它可以獲取非同步操作的訊息,promise提供了統一的api,各種非同步操作都可以用同樣的方法進行處理。
promise有下面兩個特點:
物件的狀態不受外界影響。有三種狀態:padding(進行中)、fulfilled(成功)、rejected(失敗)。只有非同步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
一旦狀態改變,就不會再變,任何時候都可以得到這個結果。三個狀態只有從padding到fulfilled或者從padding到rejected。狀態只有從padding改變到fulfilled或者refected,兩種改變。
有了promise物件,就可以將非同步操作以同步操作的流程表達出來,避免了層層巢狀的**函式。此外,promise物件提供統一的介面,使得控制非同步操作更加容易。
無法取消promise,一旦新建它就會立即執行,無法中途取消。
如果不設定**函式,promise內部丟擲的錯誤,不會反應到外部。
當處於pending狀態時,無法得知目前進展到哪乙個階段(剛剛開始還是即將完成)。
const promise = new promise((resolve, reject) => else});promise.then(res => , error => );
es6中,promise物件是乙個建構函式,用來生成promise例項。promise建構函式接受乙個函式作為引數,接受兩個引數,分別是resolve和reject兩個函式。
其中,resolve函式作用是將promise的狀態從padding改變成fufilled;而reject函式作用是將promise的狀態從padding改變成rejected。
在promise例項生產後,可以用then方法分別指定了fufilled狀態和rejected狀態的**函式。
其中then方法接受兩個引數,第乙個**函式是狀態改變fufilled時呼叫的,第二個**函式是狀態改變refected時呼叫的。第二個引數是可選的,不一定要提供。
const promise = new promise((resolve, reject) => );promise.then(() => );
console.log('end');
上面是乙個promise對的簡單寫法,我們看下上面的例子是如何輸出的。
// 執行結果
new promise()endresolve()
在上面的例子中因為promise物件是同步的所以先輸出,then方法是非同步的所以後輸出。
promise例項具有then方法,then方法是定義在原型物件promise.prototype上的。它的作用前面說過,第乙個**函式是狀態改變fufilled時呼叫的,第二個**函式(可選)是狀態改變rejected時呼叫的。
new promise((resolve, reject) => ).then(res => );
then方法的基礎呼叫寫法,可以寫乙個**方法,來執行成功後的**。then方法返回乙個的是乙個新的promise例項,因此我們可以採用鏈式寫法,即then方法後面再呼叫乙個then方法。
new promise((resolve, reject) => ).then(res => res).then(res => );
採用鏈式的then,可以指定一組按照次序呼叫的**函式。這時,前乙個**函式,有可能返回的還是乙個promise物件(即有非同步操作),這時後乙個**函式,就會等待該promise物件的狀態發生變化,才會被呼叫。
catch是用於指定發生錯誤的**函式。
new promise((resolve, reject) => ).catch(error => );
promise例項當狀態改變為rejected狀態或者操作失敗丟擲異常錯誤,就會被catch方法捕獲。所以在promise例項中reject方法等同於丟擲錯誤。如果promise的狀態已經變成了resolved,再丟擲錯誤無效。
new promise((resolve, reject) => ).catch(error => );
finally方法用於指定不管promis物件最後狀態如何,都會執行的操作。該方法是 es2018 引入標準的。
new promise((resolve, reject) => ).then(res => ).catch(error => ).finally(() =>)
promise.all方法用於將多個promise例項,包裝成乙個新的promise例項。在all方法中可以傳遞多個promise物件,當所有的promise物件狀態都返回fufilled,才會返回fulfilled,否則返回rejected。
const promise1 = new promise((resolve, reject) => )const promise2 = new promise((resolve, reject) => )
const promise3 = new promise((resolve, reject) => )
const promiseall = promise.all([promise1, promise2, promise3]).then(res => )
promise.race方法同樣是將多個promise例項,包裝成乙個新的promise例項。可以傳遞多個promise物件作為引數,如果例項紅有乙個例項率先改變狀態,那麼race的狀態就會跟著改變。
const promise1 = new promise((resolve, reject) => )const promise2 = new promise((resolve, reject) => )
const promise3 = new promise((resolve, reject) => )
const promiserace = promise.race([promise1, promise2, promise3]).then(res => ).catch(error => )
promise 結束!謝謝大家能夠指出其中的不足。
整理一下Entity Framework的查詢
entity framework是個好東西,雖然沒有hibernate功能強大,但使用更簡便。今天整理一下常見sql如何用ef來表達,func形式和linq形式都會列出來 本人更喜歡func形式 1 簡單查詢 sql select from clients where type 1 and dele...
整理一下Entity Framework的查詢
entity framework是個好東西,雖然沒有hibernate功能強大,但使用更簡便。今天整理一下常見sql如何用ef來表達,func形式和linq形式都會列出來 本人更喜歡func形式 1 簡單查詢 sql select from clients where type 1 and dele...
總結一下ES6的promise
promise有三種狀態 pending 進行中 fulfilled 已成功 和rejected 已失敗 promise建構函式接受乙個函式作為引數,該函式的兩個引數分別是resolve和reject,其中resolve函式會將pending狀態改為fulfilled,reject函式將pendin...