91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript如何實現指定數量的并發限制

發布時間:2021-04-12 09:47:39 來源:億速云 閱讀:211 作者:小新 欄目:web開發

小編給大家分享一下JavaScript如何實現指定數量的并發限制,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

在網上看到這么一道題:

JavaScript如何實現指定數量的并發限制

這道題跟魚頭這篇記錄『什么是時間分片(Time Slicing)? 』有點相似,但不同的是這次是限制異步并發的數量。

所以話不多說,我們先來康康實現

首先我們來實現一個分割數組的函數~

const group = (list = [], max = 0) => {
  if (!list.length) {
    return list
  }
  let results = []
  for (let i = 0, len = list.length; i < len; i += max) {
    results.push(list.slice(i, i + max))
  }
  return results
}

這里就是根據指定的并發數量來分割數組。主要就是 for + slice ,這沒啥好說的

接下來我們再來一個用 async + await 實現的請求集合封裝。

我們通過 for...of 去遍歷每一個異步函數,然后用 async + await 確保函數的執行順序,再用 try...catch 來保證即使 reject 報錯也不會導致無法繼續執行任務。

const requestHandler = async (
  groupedUrl = [],
  callback = () => { }
) => {
  if (!groupedUrl.length) {
    callback()
    return groupedUrl
  }
  const newGroupedUrl = groupedUrl.map(fn => fn())
  const resultsMapper = (results) => results.map(callback)
  const data = await Promise.allSettled(newGroupedUrl).then(resultsMapper)
  return data;
}

接下來就是主函數

const sendRequest = async (
  urls = [],
  max = 0,
  callback = () => { }
) => {
  if (!urls.length) {
    return urls
  }
  const groupedUrls = group(urls, max)
  const results = []
  console.log('start !')
  for (let groupedUrl of groupedUrls) {
    try {
      const result = await requestHandler(groupedUrl, callback)
      results.push(result)
      console.log('go')
    } catch { }
  }
  console.log('done !')
  return results
}

這里就是利用了 for + async + await 來限制并發。等每次并發任務結果出來之后再執行下一次的任務。

我們執行下栗子:

const p1 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p1'))
const p2 = () => Promise.resolve(2)
const p3 = () => new Promise((resolve, reject) => setTimeout(resolve, 2000, 'p3'))
const p4 = () => Promise.resolve(4)
const p5 = () => new Promise((resolve, reject) => setTimeout(reject, 2000, 'p5'))
const p6 = () => Promise.resolve(6)
const p7 = () => new Promise((resolve, reject) => setTimeout(resolve, 1000, 'p7'))
const p8 = () => Promise.resolve(8)
const p9 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p9'))
const p10 = () => Promise.resolve(10)
const p11 = () => new Promise((resolve, reject) => setTimeout(resolve, 2000, 'p10'))
const p12 = () => Promise.resolve(12)
const p13 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p11'))
const p14 = () => Promise.resolve(14)

const ps = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14]
sendRequest(ps, 3, ({reason, value}) => {
  console.log(reason || value)
})

JavaScript如何實現指定數量的并發限制

OK,我們看到結果是如我們所愿的

看完了這篇文章,相信你對“JavaScript如何實現指定數量的并發限制”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汕尾市| 石屏县| 贵南县| 澄迈县| 右玉县| 定日县| 双流县| 和林格尔县| 正宁县| 隆昌县| 阿拉善右旗| 桃园县| 南澳县| 兴和县| 沾化县| 建水县| 神木县| 九龙城区| 绍兴县| 邵武市| 静宁县| 班玛县| 密云县| 南皮县| 天峻县| 沙田区| 陇川县| 东山县| 榆社县| 疏勒县| 德阳市| 宜阳县| 滁州市| 永昌县| 沅陵县| 宁武县| 兴业县| 涿州市| 大余县| 晴隆县| 丰镇市|