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);

留言