然后继续处理Ajax队列代码

时间:2011-06-09 11:56:30

标签: jquery ajax queue

所以,我正在使用JQuery AjaxQueue来做事情,但我遇到的问题是我无法弄清楚如何在整个队列完成后继续它。我希望它通过表查看是否删除了东西,然后在完成后继续。现在发生的事情是队列中的东西将与周围的东西同时处理,因此在继续之前它不会执行ajax调用。

    var outputString = "";
    $('#errors').html("");

    $("#deletingitems tbody tr").each(function() {
        if(rowCounter == 1) {
            htmltext.append(TopofHTMLPage());
        }

        var tableValA = $(this).find("td").eq(0).html();
        var tableValB = $(this).find("td").eq(1).html().split("/")[0];

        $.ajaxQueue({
            type: "POST",
            url: "@Url.Content("~/webservices/retrieve.asmx/Get")",
            data: "{'index': '" + tableValA + "', 'identity': '" + tableValB + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {

                //http://encosia.com/2009/06/29/never-worry-about-asp-net-ajaxs-d-again/
                if (msg.hasOwnProperty("d")) {
                    // Leave the .d behind and pass the rest of
                    //  the JSON object forward.
                    outputString = msg.d;
                    $('#errors').append(outputString);
                    if(obj.valA != null) {
                        htmltext.append('<tr>');
                        htmltext.append('<td>' + obj.valA + '</td>');
                        htmltext.append('<td>' + obj.valB + '</td>');
                        htmltext.append('<td>' + obj.valC + '</td>');
                        htmltext.append('<td>' + obj.valD + '</td>');
                        htmltext.append('<td>' + obj.valE + '</td>');
                        htmltext.append('</tr>');
                    }
                }
            }
            , error: AjaxFailed
        });

        if(rowCounter == 10) {
            htmltext.append(BottomofHTMLPage());
            rowCounter = 1;
        }
        else {
            rowCounter++;
        }
    });
    // Add rows until 10 rows
    while(rowCounter <= 10) {
        htmltext.append('<tr><td></td><td></td><td></td><td></td><td></td><td></td></tr>');
        rowCounter++;
    }

    htmltext.append(BottomofHTMLPage());

    htmltext.append('</body>');
    htmltext.append('</html>');
    var page =  window.open('','NewHTMLPage','width=1500,height=600,scrollbars=yes');
    page.document.open();
    page.document.write(htmltext.toString());
    page.document.close();

2 个答案:

答案 0 :(得分:0)

我不熟悉Ajax Queue,但看起来你只需使用jQuery核就可以实现你所做的事情,只需使用回调:

var gotAttribute = function(attr)
{
    $("#deletingitems tbody tr").each(function() {
        if (this.value == 1) {
            // Do stuff with attr?
        }
    }
};

// jQuery will pass the result onto gotAttribute once available
$.ajax({ success: gotAttribute });

答案 1 :(得分:0)

Ajax是异步的(应该是ajaxQueue,否则它不会是ajax)。这意味着当您发出请求时,您的代码会在ajax获取所请求的数据时继续。您的回调将在数据准备就绪时执行,这将在您的主线代码完成后执行(请查看Is JavaScript multithreaded?)。这就是为什么你的表行出现在关闭html标签之后。

要解决您的问题,您需要将结束代码拉入回调并检测上次请求何时完成。

jQuery(function ($) {
    var i = 0;
    $('tr').each(function () {
        i++;
        $.ajax({
            url: 't.html',
            success: function (data) {
                console.log('serving: ' + i);
                if(--i <= 0) {
                    console.log('which was the last');
                }
            }
        });
    });
});

同样适用于ajaxQueue。