Promise并發(fā)下載m3u8視頻
由于很多視頻網(wǎng)站是根據(jù)m3u8文件來播放視頻,所以如果要下載視頻,就要下載對應(yīng)m3u8文件,再去根據(jù)m3u8文件解析獲取到所有單個文件的url,然后下載每一個單獨(dú)的文件,再合并。
我們先需要解析一下m3u8文件,獲取所有url

如果視頻文件比較大,那么獲取到的url數(shù)量可能會有上百個,如果我們每一個請求都是同步順序完成,比較耗費(fèi)時間。一般情況下,都會使用Promise.all來處理,但是Promise.all并不能一直保持固定的請求數(shù),假設(shè)我們有100個請求,在100個請求沒有完成之前,需要一直保持有10個請求在執(zhí)行(不考慮瀏覽器限制),如果每次使用Promise.all發(fā)送10個請求,那么在這10個請求中的其中兩個完成后,并沒有其他請求補(bǔ)充進(jìn)來,這個時候?qū)嶋H上只有8個請求在執(zhí)行。
那么,我們來簡單實(shí)現(xiàn)一個并發(fā)的函數(shù),讓100個請求在完全執(zhí)行完之前,都保持著固定數(shù)量的連接數(shù)量。
首先,我們定義一個函數(shù),接受兩個參數(shù),一個是url列表,一個是最大連接數(shù)。函數(shù)返回一個Promise,所有請求成功,返回所有結(jié)果的result,如果有某個請求失敗,則reject。
核心是在每個請求完成之后繼續(xù)消耗url列表,一直保持設(shè)置的并發(fā)數(shù)量。

標(biāo)簽: