Promise 功能與應用

2022-07-19 13:00:26 字數 2539 閱讀 3278

promise 是非同步程式設計的一種解決方案:從語法上講,promise是乙個物件,從它可以獲取非同步操作的訊息;從本意上講,它是承諾,承諾它過一段時間會給你乙個結果。promise有三種狀態:pending(等待態),fulfiled(成功態),rejected(失敗態);狀態一旦改變,就不會再變。創造promise例項後,它會立即執行。

//

當引數a大於10且引數fn2是乙個方法時 執行fn2

function

fn1(a, fn2)

}fn1(11, function

() )

一般來說我們會碰到的**巢狀都不會很多,一般就一到兩級,但是某些情況下,**巢狀很多時,**就會非常繁瑣,會給我們的程式設計帶來很多的麻煩,這種情況俗稱——**地獄。

這時候我們的promise就應運而生、粉墨登場了

promise是用來解決兩個問題的:

promise是乙個建構函式,自己身上有all、reject、resolve這幾個眼熟的方法,原型上有then、catch等同樣很眼熟的方法。

那就new乙個

let p = new promise((resolve, reject) =>, 2000);

});

promise的建構函式接收乙個引數:函式,並且這個函式需要傳入兩個引數:

從表面上看,promise只是能夠簡化層層**的寫法,而實質上,promise的精髓是「狀態」,用維護狀態、傳遞狀態的方式來使得**函式能夠及時呼叫,它比傳遞callback函式要簡單、靈活的多。所以使用promise的正確場景是這樣的:

p.then((data) =>)

.then((data) =>)

.then((data) =>

else

}, 2000);

});p.then((data) =>,(err) =>

);

then中傳了兩個引數,then方法可以接受兩個引數,第乙個對應resolve的**,第二個對應reject的**。

我們知道promise物件除了then方法,還有乙個catch方法,它是做什麼用的呢?其實它和then的第二個引數一樣,用來指定reject的**。

p.then((data) =>).

catch((err) =>);

效果和寫在then的第二個引數裡面一樣。不過它還有另外乙個作用:在執行resolve的**(也就是上面then中的第乙個引數)時,如果丟擲異常了(**出錯了),那麼並不會報錯卡死js,而是會進到這個catch方法中。

p.then((data) =>)

.catch((err) =>);

在resolve的**中,我們console.log(somedata);而somedata這個變數是沒有被定義的。如果我們不用promise,**執行到這裡就直接在控制台報錯了,不往下執行了。但是在這裡,會得到這樣的結果:也就是說進到catch方法裡面去了,而且把錯誤原因傳到了reason引數中。即便是有錯誤的**也不會報錯了,這與我們的try/catch語句有相同的功能

let promise1 = new promise(function

(resolve, reject){})

let promise2 = new promise(function

(resolve, reject){})

let promise3 = new promise(function

(resolve, reject){})

let p =promise.all([promise1, promise2, promise3])

p.then(funciton(), function

())

有了all,你就可以並行執行多個非同步操作,並且在乙個**中處理所有的返回資料,是不是很酷?有乙個場景是很適合用這個的,一些遊戲類的素材比較多的應用,開啟網頁時,預先載入需要用到的各種資源如、flash以及各種靜態檔案。所有的都載入完後,我們再進行頁面的初始化。

race的使用場景:比如我們可以用race給某個非同步請求設定超時時間,並且在超時後執行相應的操作,**如下:

//

請求某個資源

function

requestimg()

img.src = '的路徑';

});return

p; }

//延時函式,用於給請求計時

function

timeout(), 5000);

});return

p; }

promise.race([requestimg(), timeout()]).then((data) =>).

catch((err) =>);

requestimg函式會非同步請求一張,我把位址寫為"的路徑",所以肯定是無法成功請求到的。timeout函式是乙個延時5秒的非同步操作。我們把這兩個返回promise物件的函式放進race,於是他倆就會賽跑,如果5秒之內請求成功了,那麼遍進入then方法,執行正常的流程。如果5秒鐘還未成功返回,那麼timeout就跑贏了,則進入catch,報出「請求超時」的資訊。

session cookie 功能與用法

session 1.儲存在伺服器,每個人存乙份 2.可以儲存任何型別的資料 3.有乙個預設過期的時間 相對安全 但是對伺服器造成的壓力大 注意 在所有使用session的頁面最頂端要開啟session session start session start 開啟session 儲存 session ...

Python enumerate函式功能與用法示例

eunmerate在英文中是列舉 列舉的意思,在python中eunmerate 是乙個內建的函式,用於在乙個可迭代或可遍歷的物件 如列表 字串 陣列 字典 中,將物件組成乙個乙個序列和索引,可以同時獲得索引和索引值。enumerate函式原型 enumera程式設計客棧te sequence,st...

EditText的功能與用法

edittext與textview 非常相似,它甚至與textview 共用了絕大部分xml屬性與方法。edittext 與 textview的最大區別在於 edittext 可以接受使用者輸入。edittext元件最重要的屬性是inputtype,該屬性相當於html的元素的type屬性,用於將e...