AJAX帖子不可靠,使用' .then'也不起作用

时间:2015-02-27 01:28:32

标签: jquery ajax function deferred jquery-callback

我正在尝试创建一个分层导航栏,但我遇到了一些问题。

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

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

post方法并不总是有效,有时当页面加载时很好,有时它会错过一些<li>,我希望这是因为有些AJAX需要先加载它才能工作,所以我尝试使用.then和回调对帖子进行排序,这不起作用。

$(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();

});

你可以看到它Here

1 个答案:

答案 0 :(得分:0)

您的PHP后端并不总是返回内容,但它始终返回200 HTTP代码。这意味着每次都会调用您的成功回调。你的成功回调假定总是返回内容,这是没有的,因此当它假设&#34;数据&#34;时会抛出错误。是一个数组,并且&#34;切片&#34;可以调用,停止执行它的轨道。简而言之,你真的需要修复你的后端,你还应该在你的php返回的数据的javascript中进行验证,以确保对象,&#34;数据&#34;在这种情况下,你认为它是什么。

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