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

OK,우 리 는 결과 가 우리 가 원 하 는 대로 되 는 것 을 보 았 다.
자 바스 크 립 트 가 지정 한 수량의 병발 제한 을 실현 하 는 예제 코드 에 관 한 글 은 여기까지 입 니 다.자 바스 크 립 트 가 지정 한 수량 병발 제한 내용 에 대해 서 는 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기