【问题标题】:Jquery Ajax beforeSend and success,error & completeJquery Ajax beforeSend 和成功,错误和完成
【发布时间】:2014-03-06 01:57:03
【问题描述】:

我遇到了多个 ajax 函数的问题,其中 second ajax 帖子的 beforeSendfirst ajax 的 complete 函数之前执行。 p>

我在发送前添加到占位符的加载类适用于第一个 ajax 调用。然而,在第一个 ajax 请求完成后不久,该类被删除,并且在第二次和进一步调用时不再附加(记住递归调用)。

调试时显示第二个ajax调用的beforeSend函数是先调用的,第一个ajax调用的complete函数是稍后调用的。这很明显,因为从第一个 ajax 调用插入到页面中的返回数据启动了第二个调用。

简而言之,它混淆了。有什么办法可以解决吗?

功能代码如下

function AjaxSendForm(url, placeholder, form, append) {
var data = $(form).serialize();
append = (append === undefined ? false : true); // whatever, it will evaluate to true or false only
$.ajax({
    type: 'POST',
    url: url,
    data: data,
    beforeSend: function() {
        // setting a timeout
        $(placeholder).addClass('loading');
    },
    success: function(data) {
        if (append) {
            $(placeholder).append(data);
        } else {
            $(placeholder).html(data);
        }
    },
    error: function(xhr) { // if error occured
        alert("Error occured.please try again");
        $(placeholder).append(xhr.statusText + xhr.responseText);
        $(placeholder).removeClass('loading');
    },
    complete: function() {
        $(placeholder).removeClass('loading');
    },
    dataType: 'html'
});
}

并且数据包含以下 javascript/jquery 的 sn-p,它检查并启动另一个 ajax 请求。

<script type="text/javascript">//<!--
 $(document).ready(function() {
    $('#restart').val(-1)
    $('#ajaxSubmit').click();
});
//--></script>

【问题讨论】:

    标签: javascript jquery ajax recursion


    【解决方案1】:

    也许您可以尝试以下方法:

    var i = 0;
    function AjaxSendForm(url, placeholder, form, append) {
    var data = $(form).serialize();
    append = (append === undefined ? false : true); // whatever, it will evaluate to true or false only
    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        beforeSend: function() {
            // setting a timeout
            $(placeholder).addClass('loading');
            i++;
        },
        success: function(data) {
            if (append) {
                $(placeholder).append(data);
            } else {
                $(placeholder).html(data);
            }
        },
        error: function(xhr) { // if error occured
            alert("Error occured.please try again");
            $(placeholder).append(xhr.statusText + xhr.responseText);
            $(placeholder).removeClass('loading');
        },
        complete: function() {
            i--;
            if (i <= 0) {
                $(placeholder).removeClass('loading');
            }
        },
        dataType: 'html'
    });
    }
    

    这样,如果在complete 语句之前调用beforeSend 语句,i 将大于0,因此它不会删除该类。然后只有最后一次调用才能将其删除。

    我无法测试它,让我知道它是否有效。

    【讨论】:

    • 我尝试了您的解决方案,结果令人惊讶。首先,我在 beforeSend 中使用了 var requestNumber = 0 和 ++ 它,并在 complete/always 中检查了它。它显示 requestNumber == 2 和 -- 导致 1 在检查中返回 false 并且未删除加载类。但是它永远不会被删除,因为我不知道为什么,它正在为整个序列生成一个额外的请求。现在罪魁祸首已经找到了,我想解决或者发布bug请求很容易。
    • 如果函数失败,那么它会出错并完成。如果我只希望它在完成时,我可以在完成时return 1 这样它就不会出错吗?
    【解决方案2】:

    使用jQuery's promise API 实际上要容易得多:

    $.ajax(
                type: "GET",
                url: requestURL,
            ).then((success) =>
                console.dir(success)
            ).failure((failureResponse) =>
                console.dir(failureResponse)
            )
    

    或者,您可以将bind 函数传递给每个结果回调;参数顺序为:(success, failure)。只要您指定一个至少有 1 个参数的函数,您就可以访问响应。因此,例如,如果您想检查响应文本,您可以简单地执行以下操作:

    $.ajax(
                type: "GET",
                url: @get("url") + "logout",
                beforeSend: (xhr) -> xhr.setRequestHeader("token", currentToken)
            ).failure((response) -> console.log "Request was unauthorized" if response.status is 401
    

    【讨论】:

    • 感谢更新,我更新了我的代码并用新定义的、承诺的函数失败、完成和始终替换了成功、错误和完成回调函数。但是他们没有解决问题,因为当我应用@Nathan P 提供的解决方案时,问题有所不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2011-07-09
    • 2013-01-13
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多