【发布时间】:2018-03-22 08:59:48
【问题描述】:
我被一个必须处理数组的函数困住了,作为其中的一部分,它必须循环它并使用一个值执行 ajax 调用以确定它是否有效。如果发现错误,它会在处理完所有数据后返回一串错误消息。如何确保 ajax 调用在函数返回之前全部完成,记住它们只会在某些循环上触发?
我尝试了各种与延迟/承诺相关的事情,但无法做到正确:( 由于forEach,我不相信这与“我如何获得返回的异步数据”一样简单,或者即使原理相同,我也在努力实现。
下面的修剪代码 - 注意 // Do other stuff - 都在 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的调用方式也需要更改 -
谢谢@JaromandaX - 但我需要更多的帮助。我可以使用 $.Deferred() 和 $.when 来做一个基本的异步函数,但是我不能让它在这个特定的上下文中工作。
-
在 handleFileSelect 中我可以做到:
var validation = basicValidation( results.data ); $.when( validation ).done(function( results ) { if ( results.length ) { alert( 'Failed.\n\n' + results + '\nPlease correct your data, refresh the page, and try again.' ); return false; } });它适用于一个简单的异步函数,但它正确设置了 basicValidation 函数,我遇到了问题。
标签: javascript jquery ajax foreach