整理一下Promise 的用法

2022-09-13 09:57:07 字數 3180 閱讀 5927

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...