배열을 처리해야하는 함수가 있습니다.이 함수의 일부로 루프를 반복하고 유효한지를 결정하는 값을 사용하여 ajax 호출을 수행해야합니다. 오류가 발견되면 모든 데이터를 처리 한 후 오류 메시지 문자열을 반환합니다. 함수가 반환되기 전에 모든 루프가 완료 될 것이라는 점을 염두에 두면서 어떻게 AJAX 호출을 완료 할 수 있을까요?forEach 내에서 forEach 함수 내에서 Ajax 호출을 기다리는 중
모든 종류의 지연/약속 관련 작업을 시도했지만 올바르게 처리 할 수 없습니다. ( forEach로 인해 "반환 비동기 데이터를 얻는 방법" 또는 원리가 같더라도 implimentation에 어려움을 겪고 있습니다.
아래의 트림 된 코드는 차이를 만드는 경우 forEach 내에서 // 다른 것들을 수행하십시오. 주의자는 handleFileSelect()
을 호출합니다. basicValidation()
호출;
function basicValidation(data) {
// Store errors to be returned.
var failed = '';
// Loop over each row and validate.
data.forEach(function(row, index) {
// Do other stuff.
if (a) {
// Do stuff.
} else if (b) {
// Do ajax bit that only happen sometimes.
$.ajax({
url: 'https://api.postcodes.io/postcodes/' + row[5],
success: function (data) {
if (200 !== data.status) {
failed += 'Row ' + index + ':: invalid Address - lookup failed.\n';
}
// Do other checks.
},
error: function (request, status, error) {
console.log( 'Postcode lookup request failed:: ' + request.responseText + '\n' + status + '\n' + error);
}
});
}
// Do other stuff.
}
return failed;
}
function handleFileSelect(results) {
// Do the basic front-end validation.
var validation = basicValidation(results.data);
if (validation.length) {
alert('Failed.\n\n' + validation + '\nPlease correct your data, refresh the page, and try again.');
return false;
}
}
모습으로'$ .when' –
은 큰 문제는 모두 당신이 보여준 기능은 동기 결과 ('failed'와 'FALSE')을 반환 할 것입니다 도입 된 비동기 코드 - 그래서'handleFileSelect' 호출 방법도 변경해야합니다 –
Thanks @ JaromandaX -하지만 좀 더 손을 들고 가야합니다. $ .Deferred() 및 $ .when을 사용하여 기본 비동기 함수를 수행 할 수 있지만이 특정 컨텍스트에서 작동시키지 못합니다. – phil