JS:Promise.all及Promise.race
Promise.all及Promise.race使用筆記
all和race是一組工具函數,是幫助我們想要多個非同步工作同時進行的,使用方式是呼叫Promise.all(給Promise陣列)和Promise.race(給Promise陣列)。
all和race的差別是all會等待所有個Promise都resolve才會回傳陣列,而race是當有一個Promise已經resolve就會回傳結果。不過值得注意的是,兩著都是若有一個reject就會被中斷並返回reject的結果。
在上一篇中提到Promise和async可以混用,這裡馬上就用到,我們可以使用await等待Promise.all和Promise.race的結果,然後再對每個結果進行分析,下面會提供一個簡短的假想範例碼。
假如我們想要在圖書館A,B,C提供的網路API同時進行圖書搜尋,我們先找到對應的URL:Library*_URL和他的設定方法configFor*,則可以定義出以下三個搜尋用的函數,只要給定搜尋的圖書名稱t,每個搜尋用函數可以各自取的搜尋的結果。
const sendRequestToFindInLibraryA =
async (t) => fetch(LibraryA_URL, configForA(t))
const sendRequestToFindInLibraryB =
async (t) => fetch(LibraryB_URL, configForB(t))
const sendRequestToFindInLibraryC =
async (t) => fetch(LibraryC_URL, configForC(c))
接著為了同時進行搜尋,我們將它們都擺放進陣列中,我們這裡寫成一個生成函數,方便置換要搜尋的圖書名稱
const generateRequests = (t) => [
sendRequestToFindInLibraryA(t),
sendRequestToFindInLibraryB(t),
sendRequestToFindInLibraryC(t),
];
然後就可以用Promise.all呼叫上面的生成函數generateRequests並給出想要搜尋的目標就完成了!
const ResultArray = await Promise.all(
generateRequests(TargetBookName)
);
最後我們就對搜尋回來的,因為Promise.all會回傳等大小的陣列,我們還需要確認圖書館API是否有找到, 這裡先假設找不到的結果會是404,我們就能透過filter函數快速過濾找不到結果的內容,然後把所有找到的書籍數目統計起來。
const NOT_FOUND = 404;
let amount = ResultArray
.filter(result => result != NOT_FOUND)
.reduce((acc, e) => (acc + e.length), 0);
最後將書籍數目印出來,完工!
console.log('Books we founc:', amount);
留言