js 多個異步 的併發控制

 

  今天在羣裏看到一我的發的面試題:  面試

1,請實現以下的函數,能夠批量請求數據,全部的URL地址在urls參數中,同時能夠經過max參數 控制請求的併發度。當全部的請求結束後,須要執行callback回調。發請求的函數能夠直接使用fetch。 function sendRequest (urls: string[], max: number, callback: () => void) { }

 

    fetch 函數返回的是一個promise,promise對象在實例化的時候就已經開始執行了。數組

 

    

function sendRequest(arr, max, callback) { let fetchArr = [],  // 存儲併發max的promise數組
            i = 0; function toFetch() { if (i === arr.length) {   // 全部的都處理完了, 返回一個resolve
                return Promise.resolve(); } let one = fetch(arr[i++]); // 取出第i個url, 放入fetch裏面 , 每取一次i++
            one.then( () => {fetchArr.splice(fetchArr.indexOf(one), 1)}); // 當promise執行完畢後,從數組刪除
            fetchArr.push(one);  //將當前的promise存入併發數組中 其實將這個push放到上一行會更好理解,那樣就是咱們同步的思惟順序,先push進去,再等promise執行完了以後再刪除。 但因爲then是異步的,因此怎麼放均可以。
 let p = Promise.resolve(); if (fetchArr.length >= max) {     // 當並行數量達到最大後, 用race比較 第一個完成的, 而後再調用一下函數自身。
                p = Promise.race(fetchArr); } return p.then(() => toFetch()); } // arr循環完後, 如今fetchArr裏面剩下最後max個promise對象, 使用all等待全部的都完成以後執行callback
        toFetch().then(() => Promise.all(fetchArr)).then(() => { callback(); }) }
相關文章
相關標籤/搜索