Promise在並行中的使用

2021-10-22 17:18:15 字數 1514 閱讀 5571

.then的任務被放進微任務裡

settimeout的任務被放進巨集任務裡

微任務做完後再做巨集任務

const

task1=(

)=>

newpromise

((resolve, reject)

=>

,3000)}

)const

task2=(

)=>

newpromise

((resolve, reject)

=>

,4000)}

)const

task3=(

)=>

newpromise

((resolve, reject)

=>

,5000)}

)promise.

all(

[task1()

,task2()

,task3()

]).then

(null

,(reason)

=>

)

輸出結果為

第1次拒絕了
如果promise.all在執行的時候前面的promise reject了(介面呼叫失敗),就會影響後面的promise執行。

要解決這個並行問題有兩種途徑

1.使用新的方法, promise.allsettled

promise.

allsettled([

task1()

,task2()

,task3()

]).then

((reason)

=>

)

輸出結果為

[,,

]

有個問題就是allsettled現在相容性一般

2. 自己封裝乙個allsettled

//乙個處理並行的函式

const

handleparallel

=(promiselist)

=> promiselist.

map(promise => promise.

then

((value)

=>()

,(reason)

=>()

))promise.

allsettled2

=function

(promiselist)

promise.

allsettled2([

task1()

,task2()

,task3()

]).then

((reason)

=>

)

輸出結果為

[,,

]

Promise的並行和序列

這個功能promise自身已經提供,不是本文的重點。主要是依賴promise.all和promise.race。promise.all是所有的promise執行完畢後 reject resolve 返回乙個promise物件。promise.race是任意乙個promise物件執行完畢後返回乙個pr...

在並行方法體中謹慎使用鎖

除了建議88所提到的場合,要謹慎使用並行的情況還包括 某些本身就需要同步執行的場合,或者需要較長時間鎖定共享資源的場合。在對整型資料進行同步操作時,可以使用靜態類interlocked的add方法,這就極大地避免了由於進行原子操作長時間鎖定某個共享資源所帶來的同步效能損耗。回顧建議83中的例子。st...

Promise使用的心得

因為業務的關係,網頁和底層的互動很多並且很複雜,一般會巢狀好幾層,原始的ajax或者jquery的ajax寫起來巢狀太長,找問題時不容易找到切入點,因此使用es6的promise來解決ajax的多層巢狀問題。promise是抽象非同步處理物件以及對其進行各種操作的元件。promise是把類似的非同步...