【问题标题】:Waiting for an Ajax call within forEach within function [duplicate]等待函数内forEach内的Ajax调用[重复]
【发布时间】: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
  • 您的大问题是您显示的两个函数都希望返回同步结果(failedfalse) - 一旦引入异步代码就不会发生这种情况 - 所以, 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


【解决方案1】:

您是否尝试在 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 );
            }
        });

【讨论】:

  • 不推荐使用主线程中的同步请求
  • 使用async: false是非常糟糕的做法。
  • 感谢@jeramiah-harland 的回答 - 但这给了我可怕的弃用警告!
  • 是的,老实说这不是正确的答案,我应该做更多的工作来调查它。希望您能够解决您的问题。
猜你喜欢
  • 2020-08-23
  • 2017-04-07
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
相关资源
最近更新 更多