.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是把類似的非同步...