使用Q進行同步的Promises操作

2022-02-23 16:25:16 字數 1768 閱讀 7508

如何通過使用q來併發執行多個promises呢?

q(q(1), q(2), q(3))

.then(

function

(one, two, three) ,

function

(ex) );

//1

上面的**輸出結果為1。很顯然,你不能簡單地將各個promises都放到乙個q()函式裡來執行,這樣只有第乙個promise會被正確地執行,剩餘的都會被忽略掉。

你可以使用q.all來代替上面的方法,它們之間的主要區別是前者將每個promise單獨作為引數進行傳遞,而q.all則接收乙個陣列,所有要並行處理的promise都放到陣列中,而陣列被作為乙個獨立的引數傳入。

q.all([q(1), q(2), q(3)])

.then(

function

(one, two, three) ,

function

(ex) );

//[1,2,3]

上面的**輸出結果為[1, 2, 3]。所有的promises都被正確執行,但是你發現q.all返回的結果依然是乙個陣列。我們也可以通過下面這種方式來獲取promises的返回值:

q.all([q(1), q(2), q(3)])

.then(

function

(one, two, three) ,

function

(ex) );//1

//2//3

除此之外,我們還可以將then替換成spread,讓q返回乙個個獨立的值而非陣列。和返回陣列結果的方式相同,這種方式返回結果的順序和傳入的陣列中的promise的順序也是一致的。

q.all([q(1), q(2), q(3)])

.spread(

function

(one, two, three) ,

function

(ex) );//1

//2//3

那如果其中的乙個或多個promsie執行失敗,被rejected或者throw error,我們如何處理錯誤呢?

q.all([q(1), q.reject('rejected!'), q.reject('fail!')])

.spread(

function

(one, two, three) ,

function

(reason, otherreason) );

//rejected!

//undefined

如果傳入的promises中有乙個被rejected了,它會立即返回乙個rejected,而其它未完成的promises不會再繼續執行。如果你想等待所有的promises都執行完後再確定返回結果,你應當使用allsettled

q.allsettled([q(1), q.reject('rejected!'), q.reject('fail!')])

.then(

function

(results)

else

});});//1//

rejected!

//fail!

學習pthreads,使用互斥量進行同步

在進行多執行緒程式設計時,我們總會遇到全域性變數和資料結構的問題,這是多執行緒之間進行通訊的問題。如果多個執行緒同時讀寫乙個全域性變數,那麼會造成競爭或者出錯。為了解決這一問題,我們需要對全域性資料進行,使用互斥量實現鎖的機制,當某個執行緒在某個操作前進行了加鎖,那麼某個操作只能在這個執行緒進行,直...

多執行緒進行同步資料

開發中會有場景需要對接第三方系統.第三方系統往往會提供乙個中間庫,然後我們系統讀取中間庫的資料,然後經過一系列的邏輯,把資料存到自己系統中.在這裡分享一種通過生產者,消費者模式進行資料同步,接近實時 主要思路 乙個生產者執行緒,實時去中間庫查詢沒有同步的資料.多個消費者,消費生產者生產的資料 1.乙...

axios 進行同步請求 async await

介紹 axios 是乙個基於 promise 的 http 庫,它支援 promise api。像這樣 axios.post getsomething then res 而async await是一種建立在promise之上的編寫非同步或非阻塞 的新方法。async是非同步的意思,而await是as...