欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript實現(xiàn)指定數(shù)量的并發(fā)限制的示例代碼

 更新時間:2020年03月10日 09:49:27   作者:陳大魚頭  
這篇文章主要介紹了JavaScript實現(xiàn)指定數(shù)量的并發(fā)限制的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在網(wǎng)上看到這么一道題:

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

所以話不多說,我們先來康康實現(xiàn)

首先我們來實現(xiàn)一個分割數(shù)組的函數(shù)~

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
}

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

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

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

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

接下來就是主函數(shù)

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 來限制并發(fā)。等每次并發(fā)任務結(jié)果出來之后再執(zhí)行下一次的任務。

我們執(zhí)行下栗子:

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

OK,我們看到結(jié)果是如我們所愿的

到此這篇關于JavaScript實現(xiàn)指定數(shù)量的并發(fā)限制的示例代碼的文章就介紹到這了,更多相關JavaScript 指定數(shù)量并發(fā)限制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JS 對輸入框進行限制(常用的都有)

    JS 對輸入框進行限制(常用的都有)

    本文為大家介紹下使用js對輸入框進行限制:文本框只能輸入數(shù)字代碼、只能輸入數(shù)字、只能輸入字母和漢字、只能輸入英文字母和數(shù)字等等,還有很多,感興趣的可以學習下
    2013-07-07
  • JS使用ajax從xml文件動態(tài)獲取數(shù)據(jù)顯示的方法

    JS使用ajax從xml文件動態(tài)獲取數(shù)據(jù)顯示的方法

    這篇文章主要介紹了JS使用ajax從xml文件動態(tài)獲取數(shù)據(jù)顯示的方法,實例分析了javascript使用Ajax技術操作XML文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 微信小程序dom操作的替代思路實例分析

    微信小程序dom操作的替代思路實例分析

    這篇文章主要介紹了微信小程序dom操作的替代思路,結(jié)合實例形式分析了微信小程序通過事件響應、動態(tài)操作元素屬性來實現(xiàn)dom操作效果,需要的朋友可以參考下
    2018-12-12
  • 微信小程序上傳圖片到別的域名文件下的示例代碼

    微信小程序上傳圖片到別的域名文件下的示例代碼

    這篇文章主要介紹了微信小程序上傳圖片到別的域名文件下的示例代碼,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • JavaScript實現(xiàn)進度條效果

    JavaScript實現(xiàn)進度條效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)進度條效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • js實現(xiàn)字符串的16進制編碼不加密

    js實現(xiàn)字符串的16進制編碼不加密

    關于十六進制編碼的問題在很多情況下都會用到,所以使用JS寫了個小程序轉(zhuǎn)換一下
    2014-04-04
  • 分享15個JavaScript的重要數(shù)組方法

    分享15個JavaScript的重要數(shù)組方法

    這篇文章主要介紹了分享15個JavaScript的重要數(shù)組方法,數(shù)組方法的重要一點是有些是可變的,有些是不可變的。在決定針對特定問題使用哪種方法時,務必牢記,下文就來分享重要數(shù)組方法,需要的小伙伴可以參考一下
    2022-05-05
  • Discuz 公告效果(自動換行,無間隙滾動)

    Discuz 公告效果(自動換行,無間隙滾動)

    Discuz 公告效果效果代碼,可以自動換行和無間隙滾動
    2009-03-03
  • JavaScript制作簡易計算器(不用eval)

    JavaScript制作簡易計算器(不用eval)

    這篇文章主要為大家詳細介紹了JavaScript制作簡易計算器的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript獲取頁面元素的常用方法詳解

    JavaScript獲取頁面元素的常用方法詳解

    這篇文章主要介紹了JavaScript獲取頁面元素的常用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論