在尝试获取下一个请求之前,同步jquery请求等待完成

时间:2013-02-24 18:35:21

标签: jquery

我已阅读了许多主题,问题和问题,我找到了答案。 但我想问一下,如果我的功能还可以。

我必须在onclick事件中使用不同的id来处理表单。

function setBoocking() {
    if ($('.ajaxre').length) {
        var key = 0;
        //var ajaxboocking = [];
        var sotredPDF = new Array();
        $('.ajaxre').each(function () {
            var form = $(this);
            var data = form.serialize();
            $.ajax({
                async: false,
                timeout: 4000,
                url: "ajaxloader.php",
                type: "POST",
                data: data,
                dataType: "json",
                success: function ($data) {
                    if ($data != null) {
                        if ($data.status == 1) {
                            alert("all fine"):
                        }
                    }
                },
                error: function ($databack) {
                    ajaxfehler('normal');
                    loading('end');
                }
            });
        });
    }
}

HTML

<div class="ajaxre">
    <form class="ajaxre" id="1">
        <input type="hidden" name="test" value="test1" />
    </form>
</div>
<div class="ajaxre">
    <form class="ajaxre" id="2">
        <input type="hidden" name="test" value="test2" />
    </form>
</div>
<div class="ajaxre">
    <form class="ajaxre" id="3">
        <input type="hidden" name="test" value="test3" />
    </form>
</div>
<br />
<br /><a onclick="setBoocking();">test</a>

所以你看我在我的ajax请求async:false。这样可行。但我可以使我的函数使用asynchronus请求“我将设置timout函数”不用asnc,并等待一个reuest完成或得到错误,然后尝试下一个请求?

非常感谢

2 个答案:

答案 0 :(得分:0)

如果请求发生,你可以尝试这样的事情,延迟函数调用一秒钟。

var pause = false;
function request(data) {
    if (!pause) {
        pause = true;
        $.ajax({
            url: "ajaxloader.php",
            type: "POST",
            data: data,
            dataType: "json",
            success: function ($data) {
                if ($data != null) {
                    if ($data.status == 1) {
                        alert("all fine");
                        pause = false;
                    }
                }
            },
            error: function ($databack) {
                ajaxfehler('normal');
                loading('end');
                pause = false;
            }
        });
    } else {
        setTimeout(function() {
            request(data);
        }, 1000);
    }
}


function setBoocking() {
    if ($('.ajaxre').length) {
        var key = 0;
        //var ajaxboocking = [];
        var sotredPDF = new Array();
        var in_request = false;
        $('.ajaxre').each(function () {
            request($(this).serialize());
        });
    }
}

答案 1 :(得分:0)

Ajax请求返回了所知的延迟,你可以做的是将所有ajax请求的响应存储在一个数组中然后使用。

$.when.apply($, promises).then(function(){
});

这将允许您的所有调用都运行异步。 (Promises是ajax延迟对象的数组)。

这篇文章可以帮助您充分理解:

http://richardneililagan.com/2011/05/using-deferred-objects-in-jquery-1-5/