JavaScript For 루프 내의 비동기 프로세스
JavaScript에서 for 루프는 비동기식으로 실행될 수 있으므로 콜백 작업 시 예상치 못한 결과가 발생할 수 있습니다. 다음 예를 고려하십시오.
var i; var j = 10; for (i = 0; i < j; i++) { asynchronousProcess(callbackFunction() { alert(i); }); }
이 코드는 0에서 10까지의 숫자로 경고를 표시하려고 합니다. 그러나 루프의 비동기 특성으로 인해 여러 루프 반복이 발생한 후에 콜백 함수가 트리거될 수 있습니다. 결과적으로 i의 더 높은 값이 표시됩니다.
해결책
To 이 문제를 해결하려면 각 콜백의 클로저에서 루프의 인덱스를 캡처하는 것이 중요합니다. 이는 여러 가지 방법으로 달성할 수 있습니다.
someArray.forEach(function(item, i) { asynchronousProcess(function(item) { console.log(i); }); });
var j = 10; for (var i = 0; i < j; i++) { (function(cntr) { // Capture the value of `i` into `cntr` asynchronousProcess(function() { console.log(cntr); }); })(i); }
var j = 10; for (var i = 0; i < j; i++) { asynchronousProcess(i, function(cntr) { console.log(cntr); }); }
const j = 10; for (let i = 0; i < j; i++) { asynchronousProcess(function() { console.log(i); }); }
async function someFunction() { const j = 10; for (let i = 0; i < j; i++) { // Wait for previous promise to resolve before proceeding await asynchronousProcess(); console.log(i); } }
function someFunction() { let promises = []; for (let i = 0; i < 10; i++) { promises.push(asynchronousProcessThatReturnsPromise()); } return Promise.all(promises); } someFunction().then(results => { // Array of results in order console.log(results); }).catch(err => { console.log(err); });
위 내용은 JavaScript For 루프에서 비동기 프로세스를 사용할 때 예기치 않은 결과를 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!