JavaScript for 루프 내 비동기 처리: 변수 범위 문제 해결
비동기 프로세스를 활용하는 for 루프 내에서 이벤트 루프를 실행할 때 , 콜백 함수가 루프 변수 i에 대해 잘못된 값을 검색하는 문제가 발생하는 것이 일반적입니다. 이 동작은 비동기 작업이 완료되기 전에 루프가 반복을 완료한다는 사실에서 비롯됩니다. 결과적으로 콜백은 모두 i의 최종 값을 참조합니다.
이 문제를 해결하고 각 콜백이 올바른 i 값을 받도록 보장하는 몇 가지 전략이 있습니다.
함수 클로저를 활용하면 각 반복마다 i 값을 고유하게 캡처할 수 있습니다. 이는 익명 인라인 함수 클로저를 통해 달성할 수 있습니다:
someArray.forEach((item, i) => { asynchronousProcess(() => { console.log(i); }); });
각 반복마다 고유한 i 값을 관리하는 외부 함수를 만들 수 있습니다. 이 함수는 비동기 프로세스에 인수로 전달될 수 있습니다:
const j = 10; for (let i = 0; i < j; i++) { (function(cntr) { asynchronousProcess(cntr, (result) => { console.log(result); // cntr will hold the correct value of i }); })(i); }
귀하의 환경이 ES6을 지원하는 경우 for 루프 선언 내에서 let 키워드를 사용하여 각 반복마다 고유한 i 값을 생성할 수 있습니다.
const j = 10; for (let i = 0; i < j; i++) { asynchronousProcess(() => { console.log(i); }); }
이 접근 방식에는 병렬이 아닌 순차적으로 실행되도록 비동기 작업을 직렬화하는 작업이 포함됩니다. async/await를 활용하고 비동기 프로세스에서 promise를 반환하면 한 번에 하나의 작업만 활성화됩니다. 그러나 다음 기능을 지원하는 최신 환경이 필요합니다.
async function someFunction() { const j = 10; for (let i = 0; i < j; i++) { await asynchronousProcess(); console.log(i); } }
비동기 작업을 병렬로 실행하지만 여전히 루프 순서대로 결과를 수집하는 것이 목표인 경우 Promise.all()을 사용할 수 있습니다.
async function someFunction() { const promises = []; for (let i = 0; i < 10; i++) { promises.push(asynchronousProcessThatReturnsPromise()); } return Promise.all(promises); } someFunction().then((results) => { console.log(results); // array of results in order });
위 내용은 JavaScript의 비동기 For 루프 변수 범위 문제를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!