非同步Promise及狀態特點

2022-09-10 10:48:09 字數 2963 閱讀 2848

promise

非同步通訊程式設計的一種解決方案,它比傳統**式更加的強大;解決了es6前多層次巢狀的同步、非同步,執行順序混亂且不好維護等問題。

promise使用 new 來呼叫 promise 的構造器來進行例項化,接受乙個函式作為引數,並且要傳入resolve、reject兩個引數執行**,new promise((resolve,reject)=>{})  。

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

else

});

把原來多層巢狀的的**函式分離出來,通過

可進行連綴鏈式操作.then().catch()

p.then((val)=>).

catch((reason)=>)

catch() 方法也可以作為 then 的第二引數存在,

//

一體化操作

p.then((val)=>,(reason)=>)

模擬多層非同步通訊的例項測試,非同步多個內容,並按指定順序執行,

不進行promise非同步的執行順序

//

模擬非同步1

settimeout(()=>,3500);

//模擬非同步2

settimeout(()=>,800);

//模擬非同步3

settimeout(()=>,1500);

promise非同步:

let p1=new promise((resolve,reject)=>,3500);

});let p2=new promise((resolve,reject)=>,800);

});let p3=new promise((resolve,reject)=>,1500);

});

p1.then(val=>).then(val=>).then(val=>)
同時(3500):  非同步1  非同步2  非同步3

狀態特點

promise物件非同步操作的三種狀態:

(1)pending初始狀態 (進行中) 

(2)fulfilled成功

(3)rejected失敗

非同步操作執行後,它得到的結果來決定其當前狀態,其它任何操作都無法改變.

promise狀態只有兩種執行方式:1、

pendingfulfilled

2、從pendingrejected

當狀態已經固定後,此時就變成resolved(已完成),

pending → resolve 方法 → fulfilled → resolved

pending → reject 方法 → rejected → resolved

更多方法

使用promise.all(),可以並行執行多個非同步操作,並且在乙個**中處理所有的返回資料(誰跑的慢,以誰為準)。

promise.all() 方法的引數必須具有 iterator (迭代器)介面,且返回的每個成員都是 promise 例項。

接受乙個陣列作為引數,p1、p2、p3 都是 promise 物件的例項。

let p=promise.all([p1,p2,p3]);

p.then(val=>)

p 的狀態由 p1、p2、p3 決定,分成兩種情況:

① 只有p1、p2、p3的狀態都變成fulfilled,p的狀態才會變成fulfilled,此時p1、p2、p3的返回值組成乙個陣列,傳遞給p的**函式。

② 只要p1、p2、p3之中有乙個被rejected,p的狀態就變成rejected,此時第乙個被reject的例項的返回值,會傳遞給p的**函式。

誰跑的快,以誰為準執行**,只輸出第乙個改變狀態的例項。

只要p1、p2、p3之中有乙個例項率先改變狀態,p的狀態就跟著改變。那個率先改變的promise例項的返回值,就傳遞給p的返回值。

let pp=promise.race([p1,p2,p3]);

pp.then(val=>)

語法糖:resolve()直接返回成功的 promise例項

reject()直接返回失敗 promise例項

let ps=promise.resolve("成功");
等同於 :

let pj=promise.reject("失敗");

ps.then(val=>).catch(reason=>);
常用型別 :保持型別統一性

function

getp())

}else

}getp().then(val=>)

如果值為true,可以正常返回

,但如果為false則會報錯

,為了讓型別統一,將返回的  0 

改成 promise型別,這時候就可以用到語法糖

Promise 用法 及 特點

1 promise 是什麼?從 語法上來說是乙個 建構函式,從功能上來說是乙個封裝好的解決非同步載入的方法 注意 同步 是在他的建構函式中,非同步 是在 then 裡面執行的 2 promise 用來 解決什麼的?乙個是 為了解決 非同步 必須 在啟動任務之前執行,還有乙個是為了解決 地獄的問題 3...

js的非同步載入及promise的三種狀態

恢復內容開始 我們平時經常使用的就是這種同步載入的形式 同步模式,又稱阻塞模式,會阻止瀏覽器的後續處理,停止了後續的解析,因此停止了後續的檔案載入 如影象 渲染 執行。js 之所以要同步執行,是因為 js 中可能有輸出 document 內容 修改dom 重定向等行為,所以預設同步執行才是安全的。以...

非同步promise機制

1.promise鏈 const setdelay millisecond 毫秒後輸出的 millisecond const setdelaysecond seconds 秒,一共需要延遲 秒 resolve setdelay 2000 這裡依賴上乙個promise seconds 1000 set...