2

我正在编写一个处理 mysql 到 mongodb 的 Sql 转换器。我正在用 ajax 为我的转换器编写一个接口。

Ajax 正在处理巨大的转换。这限制了 mysql 选择代码并一次进行 1000 次转换。

我的代码是:

$(document).ready(function()
{
<!--Start JQuery Ajax Requests-->
var pages;
var type;
$("input").click(function(event) {
    pages = $(this).attr("icr");
    type = $(this).attr("id");
    runRequest(0);
});

function runRequest(num){

    if (num > 3){
    $("#console").append("Finish!!!");
    return;
    }

    $.ajax
    ({
    type: "POST",
    url: "#",
    async: false,
    data: "type="+type+"&page="+num*1000,
    success: function(msg){
        $("#console").ajaxComplete(function(event, request, settings)
        {
            $("#console").append(msg);
            runRequest(num+1);
        });
    }
    });
}
});

此代码必须运行 3 次相同的函数并通过乘以发送限制数。但不知何故,runRequest 的 num 变量永远不会达到 3,firebug 控制台将 num 显示为 1 或有时为 2,并且它会无限重复。如何避免它并使其仅运行 3 个同步调用?

4

2 回答 2

2

这是另一种方式:

for(i=0; i<5; i++) {
    $.ajax({
        type: "GET",
        url: '/api/foo/?bar=' + i,
        ajaxI: i,
        success: function(widgets) {
            x = this.ajaxI; // now you can use x instead of i

            // ...
        }
    });
}
于 2013-05-09T23:19:24.637 回答
1

我相信问题出在您使用.ajaxComplete(). 根据jQuery docs,它是一个单独的事件处理程序注册方法。换句话说,您的成功函数正在注册一个事件以在下一次完成时触发。我认为这也会导致您的第一个数据集被丢弃。

附加说明,您正在使用data参数来传递数据。这应该是一个对象,而不是查询字符串。如果您使用 GET Ajax 调用,它会被转换为查询字符串。url: "?type="+type+"&page="+num*1000,并且data: { "type": type, "page": num*1000 }是等价的。

尝试以这种方式重写它:

$.ajax({
    type: "POST"
    url: "#",
    async: false,
    data: { "type": type, "page": num*1000 },
    success: function(msg) {
        $("#console").append(msg);
        runRequest(num+1);
    });
}

.ajaxComplete()方法更多是为了将单独的函数调用或行为插入到每个 ajax 成功处理程序中(当您在同一页面上有许多这样的请求并希望每个请求都附加到控制台时,除了执行它们的正常回调之外) . 像这样:

$(document).ready(function()
{
    $("#console").ajaxComplete(function(event, request, settings)
    {
        // $(this) is pointing to the #console ID because the function is bound to it
        $(this).append('Triggered ajaxComplete handler. The result is ' +
                 xhr.responseHTML);
        runRequest(num+1);
    });
    // variables

    // document event bindings/handlers

    // Ajax functions (you could move this outside of the .ready function

}
于 2012-09-08T18:04:21.533 回答