在函数内等待forEach内的Ajax调用

时间:2017-10-10 20:29:07

标签: javascript jquery ajax foreach

我遇到了一个必须处理数组的函数,作为其中的一部分,它必须遍历它并使用值执行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;
    }
}

1 个答案:

答案 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 );
            }
        });