javascript - 回调函数没有获取到数据

标签 javascript jquery ajax

经过长时间的研究,我尝试通过回调处理一些 AJAX 数据。我是意大利用户,所以如果我的解释不清楚,我深表歉意(实际上,我很难用英语解释我的问题)。

我正在尝试通过回调传递一些数据。我的 jQuery.ajax.async 没有设置为 false,因为我需要在异步模式下工作。因此,根据我在这里找到的一些帖子,我试图将回调传递给我的函数。但如果我尝试通过警报功能显示此数据,我可以看到它是未定义的。代码如下:

function loadentities(id, username, password, system, host)
{
    var postData = "username=" + encodeURI(username) +
        "&password=" + encodeURI(password) +
        "&system=" + encodeURI(system) +
        "&host=" + encodeURI(host);

    jQuery.ajax({

        type: "POST",
        dataType: "json",
        data: postData,
        beforeSend: function(x) 
        {       
            if(x && x.overrideMimeType) 
            {   
                x.overrideMimeType("application/json;charset=UTF-8");
            }
        },
        url: 'operations.php?op=loadentities',
        error: function(x, textStatus, errorThrown)
        {
            alert("Request failed: " + textStatus + " " + errorThrown);
        },
        success: function(data) 
        {
            var html = "";
            for(var i=0; i < data.length; i++)
            {
                html += "<li><a onclick=\"showhide('" + data[i].entity + "');\">" + data[i].entity + "</a><ul id=\"" + data[i].entity + "\" class=\"list\"></ul></li>"; 
                loadlastfiveevents(username, password, system, host, data[i].entity, function(data)
                            {
                                 alert(data);
                                 entityData = new Array(); 
                                 for(var i = 0; i < data.length; i++)
                                 {
                                     var entityDataEntry = new Object();
                                     entityDataEntry.key = data[i].key;
                                     entityDataEntry.event = data[i].event;
                                     entityDataEntry.timestamp = data[i].timestamp;
                                     entityData.push(entityDataEntry);
                                 }
                                 alert(data[0].key);                                                      
                             });
                entitiesValues[entitiesIndex++] = data[i].entity;
            }

            jQuery(html).appendTo('#hlentity' + id);
        }
    }); //end jQuery.ajax
}

function loadlastfiveevents(username, password, system, host, entity, buildlastfiveevents)
{
    var postData = "username=" + encodeURI(username) +
        "&password=" + encodeURI(password) +
        "&system=" + encodeURI(system) +
        "&host=" + encodeURI(host) +
        "&entity=" + encodeURI(entity);

    jQuery.ajax({

        type: "POST",
        dataType: "json",
        data: postData,
        beforeSend: function(x) 
        {       
            if(x && x.overrideMimeType) 
            {   
                x.overrideMimeType("application/json;charset=UTF-8");
            }
        },
        url: 'operations.php?op=getlatestevents',
        error: function(x, textStatus, errorThrown)
        {
            alert("Request failed: " + textStatus + " " + errorThrown);
        },
        success: function(data) 
        {
            var color = "green";
            var html = "";
            for(var i = 0; i < data.length; i++)
            {
                if(data[i].event == "SUP") color = "green";
                else if(data[i].event == "IER") color = "yellow";
                else if(data[i].event == "SDW") color = "black";
                else color = "red";
                html += "<li><img src=\"images/" + color + ".jpg\" />" + data[i].key + " " + data[i].event + " " + data[i].timestamp + "</li>"; 
            }
            jQuery(html).appendTo('#' + entity);
            propagate(entity, data[0].event);
            buildlastfiveelements(data);
        }
    }); //end jQuery
}

我希望这篇文章足够清楚,感谢您的耐心和时间。

编辑:这是 getlatestevents 返回的 JSON 代码示例(在 loadlast Fiveevents 内)。

[
    {
        "key": "error",
        "event": "SUP",
        "timestamp": "2012-11-16 11:13:36"
    },
    {
        "key": "error",
        "event": "SDW",
        "timestamp": "2012-11-16 11:12:57"
    },
    {
        "key": "error",
        "event": "SUP",
        "timestamp": "2012-11-16 11:11:32"
    },
    {
        "key": "error",
        "event": "SDW",
        "timestamp": "2012-11-15 19:40:31"
    },
    {
        "key": "timeout",
        "event": "SER",
        "timestamp": "2012-11-15 19:30:54"
    }
]

最佳答案

这行不通。

您将数据类型设置为 json,这意味着您希望返回 JSON 结果,其他任何操作都会失败。

然后,您使用基于返回的 JSON 对象长度的 for 循环进行迭代,并且由于对象没有长度,因此 for 循环永远不会运行。

您要么期望数组,它具有 length 属性,但由于数据类型设置为 JSON,所以它们不会通过,或者您期望对象,它们作为 JSON 对象通过,但没有长度属性,必须使用 for(key in object)$.each(object, function(key, value) {...}) 等循环。

关于javascript - 回调函数没有获取到数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13443233/

相关文章:

javascript - 通过 Ajax 上传文件附加数据,append() 不起作用

javascript - Ajax 表单提交进度功能失败?

javascript - AngularJS 跨 Controller 更新文本框

javascript - Vue JS "PROP MUTATING"用于上传图像

javascript - SheetJS,修复记录 : Worksheet properties from/xl/workbook. xml 部分(工作簿)

javascript - 如果其中有 setTimeout,则不会调用 iOS 6 js 事件函数

javascript - d3.js scale 不会在顶部放置刻度

javascript - 无法为每个输入字段提交右键[单个表单中的多个按钮和输入字段]

javascript - 用javascript数组填充struts2 select标签

javascript - React 是如何在不需要 jQuery 的情况下允许 $.ajax 的?