日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
JavaScript如何實(shí)現(xiàn)指定數(shù)量的并發(fā)限制-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!為您提供成都網(wǎng)站制作、做網(wǎng)站、成都網(wǎng)頁(yè)設(shè)計(jì)、微信小程序開(kāi)發(fā)、成都網(wǎng)站開(kāi)發(fā)、成都網(wǎng)站制作、成都軟件開(kāi)發(fā)、成都App制作是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來(lái)見(jiàn)證!

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

JavaScript如何實(shí)現(xiàn)指定數(shù)量的并發(fā)限制

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

所以話不多說(shuō),我們先來(lái)康康實(shí)現(xiàn)

首先我們來(lái)實(shí)現(xiàn)一個(gè)分割數(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ù)量來(lái)分割數(shù)組。主要就是 for + slice ,這沒(méi)啥好說(shuō)的

接下來(lái)我們?cè)賮?lái)一個(gè)用 async + await 實(shí)現(xiàn)的請(qǐng)求集合封裝。

我們通過(guò) for...of 去遍歷每一個(gè)異步函數(shù),然后用 async + await 確保函數(shù)的執(zhí)行順序,再用 try...catch 來(lái)保證即使 reject 報(bào)錯(cuò)也不會(huì)導(dǎo)致無(wú)法繼續(xù)執(zhí)行任務(wù)。

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

接下來(lái)就是主函數(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 來(lái)限制并發(fā)。等每次并發(fā)任務(wù)結(jié)果出來(lái)之后再執(zhí)行下一次的任務(wù)。

我們執(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)
})

JavaScript如何實(shí)現(xiàn)指定數(shù)量的并發(fā)限制

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

看完了這篇文章,相信你對(duì)“JavaScript如何實(shí)現(xiàn)指定數(shù)量的并發(fā)限制”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)站題目:JavaScript如何實(shí)現(xiàn)指定數(shù)量的并發(fā)限制-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.dlmjj.cn/article/djcsjh.html