Jquery AJAX帖子不可靠,使用“.then”也不起作用

Jquery AJAX帖子不可靠,使用“.then”也不起作用,jquery,ajax,function,deferred,jquery-callback,Jquery,Ajax,Function,Deferred,Jquery Callback,我试图创建一个分层导航栏,但遇到了一些问题 我使用了一系列AJAX post方法将div ID信息发布到PHP页面,然后该页面运行循环并检索数据库中的所有类别 这是通过四个步骤完成的,首先调用顶级类别1,然后调用顶级类别2,然后运行两个循环3-9和10-50,这些循环应该从数据库中检索最多50个类别并对它们进行排序 post方法并不总是有效的,有时页面加载时会很好,有时会遗漏一些,我想这是因为一些AJAX需要先加载一个,然后才能工作,所以我尝试使用。然后,通过回调来对帖子排序,这不起作用 $(d

我试图创建一个分层导航栏,但遇到了一些问题

我使用了一系列AJAX post方法将div ID信息发布到PHP页面,然后该页面运行循环并检索数据库中的所有类别

这是通过四个步骤完成的,首先调用顶级类别1,然后调用顶级类别2,然后运行两个循环3-9和10-50,这些循环应该从数据库中检索最多50个类别并对它们进行排序

post方法并不总是有效的,有时页面加载时会很好,有时会遗漏一些,我想这是因为一些AJAX需要先加载一个,然后才能工作,所以我尝试使用。然后,通过回调来对帖子排序,这不起作用

$(document).ready(function() {

    var IDs = [];
    $("#menu").find("li").each(function() {
        IDs.push(this.id);
    });
    var arr = $.makeArray(IDs);
    var full_list = ""
    for (var i = 0; i < arr.length; ++i) {
        full_list = full_list + arr[i] + ' '

    }
    //INDEPENDANT CALL
    function A() {
            $.ajax({
                url: 'DisplayCategories/SubCat.php',
                type: 'post',
                data: {
                    'Parent': full_list
                },
                success: function(data) {
                    var Element = data.slice(0, 2);
                    NewData = data.substr(2);
                    $(Element).after(NewData);


                }
            }).error(function() {
                alert('error');
            }).complete(function(data) {
                var Element = data.slice(0, 2);
                NewData = data.substr(2);
                $(Element).after(NewData);


            });
        }
        //INDEPENDANT CALL

    function B() {
        $.ajax({
            url: 'DisplayCategories/SubCatCrafts.php',
            type: 'post',
            data: {
                'Parent': full_list
            },
            success: function(data) {
                var Element = data.slice(0, 2);
                NewData = data.substr(2);
                $(Element).after(NewData);


            }
        }).error(function() {
            alert('errosr');
        }).complete(function(data) {
            var Element = data.slice(0, 2);
            NewData = data.substr(2);
            $(Element).after(NewData);


        });
    }

    function C() {
        for (i = 3; i < 10; i++) {
            $.ajax({
                url: 'DisplayCategories/SubCatLevelThree.php',
                type: 'post',
                data: {
                    'Parent': i
                },
                success: function(data) {
                    var Element = data.slice(0, 2);
                    NewData = data.substr(2);
                    $(Element).after(NewData);


                }
            }).error(function() {
                alert('error');
            }).complete(function(data) {
                var Element = data.slice(0, 2);
                NewData = data.substr(2);
                $(Element).after(NewData);


            });


        }
    }

    function D() {
        for (s = 11; s < 50; s++) {
            $.ajax({
                url: 'DisplayCategories/SubCatLevelEleven.php',
                type: 'post',
                data: {
                    'Parent': s
                },
                success: function(data) {
                    var Element = data.slice(0, 3);
                    NewData = data.substr(3);
                    $(Element).after(NewData);


                }
            }).error(function() {
                alert('error');
            }).complete(function(data) {
                var Element = data.slice(0, 3);
                NewData = data.substr(3);
                $(Element).after(NewData);



            });

        }
    }
    B();
    A();
    C();
    D();

});

您可以在现场看到它

您的PHP后端并不总是返回内容,但它总是返回200个HTTP代码。这意味着你的成功回电也会在每次都被回电。您的成功回调假定总是返回内容,而没有返回内容,因此当它假定数据是一个数组并且可以调用该切片时,会抛出一个错误,从而停止在其轨道中的执行。简而言之,您确实需要修复后端,并且还应该在javascript中验证php返回的数据,以确保对象(本例中的数据)是您所认为的


您还可能希望使用开发控制台,以便自己能够看到所有这些。我很喜欢Firefox中的firebug,但所有主流浏览器都内置了firebug

抱歉,我对这一点很陌生,我没有对PHP文件进行验证,因为我只是先确保它工作,但是我仍然不明白为什么它有时可以刷新页面,我认为Ajax没有给PHP循环足够的时间来运行,我使用了ob_flush;在PHP循环中返回所有结果,但仍然无法完全工作。您误解了,除了修复PHP之外,还需要在javascript中进行验证。不能对非数组的对象调用数组函数。