我遇到了一个必须处理数组的函数,作为其中的一部分,它必须遍历它并使用值执行ajax调用以确定它是否有效。如果发现错误,它会在处理完所有数据后返回一串错误消息。如何在函数返回之前确保ajax调用全部完成,记住它们只会触发某些循环?
我尝试了各种与延期/承诺相关的事情,但无法做到正确:( 我不相信这和#34一样简单;我如何获得返回异步数据"由于forEach,或者即使原则是相同的,我也在努力实现这一目标。
下面的修剪代码 - 注意//做其他的东西 - 在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;
}
}
答案 0 :(得分:0)
您是否尝试在AJAX中设置async: false
?
根据docs:
async(默认值:true)类型:Boolean默认情况下,发送所有请求 异步(即默认设置为true)。如果你需要 同步请求,将此选项设置为false。
这将在继续之前等待响应。
// Do ajax bit.
$.ajax({
url: 'https://api.postcodes.io/postcodes/' + row[5],
async: false,
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 );
}
});