> 웹 프론트엔드 > JS 튜토리얼 > 배열 반복을 통해 약속을 통해 매개변수를 순차적으로 전달하는 방법은 무엇입니까?

배열 반복을 통해 약속을 통해 매개변수를 순차적으로 전달하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-20 14:57:29
원래의
859명이 탐색했습니다.

How to Sequentially Pass Parameters through Promises with Array Iteration?

배열 반복을 통해 Promise를 통해 순차적으로 매개변수 전달

다음 작업을 고려하세요.

var myArray = [1, 2, 3, 4, 5, 6]</p>
<p>function myPromise(num){<br> return new Promise(res => {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">window.setTimeout(()=>{
  res(  console.log("done: " + num)  )
},2000)
로그인 후 복사

})
}

myPromise(myArray[0])
.then(x => myPromise(myArray[1]))
.then(x => myPromise(myArray[2]) )
.then(x => myPromise(myArray[3]))
.then(x => myPromise(myArray[4]))
.then(x => myPromise(myArray) [5]))

위와 같은 코드는 Promise를 순차적으로 실행합니다. 그러나 배열이 동적으로 채워지면 각 멤버에 대해 myPromise()를 실행하는 것이 어려워집니다.

Promises를 사용한 일시 중지 가능한 반복

실행하는 "일시 중지 가능한 루프"를 생성하려면 계속하기 전에 해결을 기다리는 myPromise():

Fold 메서드

myArray.reduce(
  (p, x) =>
    p.then(() => myPromise(x)),
  Promise.resolve()
)
로그인 후 복사

이 메서드는 배열 요소만큼 많은 Promise를 생성하지만 다음과 같은 경우에는 깔끔한 솔루션입니다. 이는 허용됩니다.

비동기 함수 방법

const forEachSeries = async (iterable, action) => {
  for (const x of iterable) {
    await action(x)
  }
}

forEachSeries(myArray, myPromise)
로그인 후 복사

비동기 함수는 더 읽기 쉽고 메모리 효율적인 솔루션을 제공합니다.

수집 반환 값

반환 값을 배열로 수집하려는 경우:

const mapSeries = async (iterable, fn) => {
  const results = []

  for (const x of iterable) {
    results.push(await fn(x))
  }

  return results
}
로그인 후 복사

또는 비동기 기능 지원이 없는 경우:

const mapSeries = (iterable, fn) => {
  const iterator = iterable[Symbol.iterator]()
  const results = []
  const go = () => {
    const {value, done} = iterator.next()

    if (done) {
      return results
    }

    return fn(value).then(mapped => {
      results.push(mapped)
      return go()
    })
  }

  return Promise.resolve().then(go)
}
로그인 후 복사

사용 예

forEachSeries 메서드를 사용하는 실행 가능한 코드 조각:

const myArray = [1, 2, 3, 4, 5, 6]

const sleep = ms =>
  new Promise(res => {
    setTimeout(res, ms)
  })

const myPromise = num =>
  sleep(500).then(() => {
    console.log('done: ' + num)
  })

const forEachSeries = async (iterable, action) => {
  for (const x of iterable) {
    await action(x)
  }
}

forEachSeries(myArray, myPromise)
  .then(() => {
    console.log('all done!')
  })
로그인 후 복사

위 내용은 배열 반복을 통해 약속을 통해 매개변수를 순차적으로 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿