2012-11-18 74 views
0

经过长期的研究,我试图通过回调来处理一些AJAX数据。我是一个意大利用户,所以如果我不清楚我的解释,我很抱歉(实际上,我很难用英文解释我的问题)。回调函数没有获取数据

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

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返回(loadlastfiveevents内)JSON代码的样本。

[ 
    { 
     "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" 
    } 
] 
+0

尝试格式化您的代码,它不容易阅读(空格)。可以肯定的是,您指定了JSON数据类型,因此您的AJAX网址会返回JSON。对?否则它将无法工作 – sdespont

+0

您在beforeSend时想要做什么? – sdespont

+0

@sdespont这是一条线,以确保正确处理返回的数据。 我与getlatestevents(loadlastfiveevents内)返回的JSON数据的样本更新的问题 – shadow

回答

2

这不起作用。

你的数据类型设置为JSON,这意味着你期望返回一个JSON的结果,任何东西都不会失败。

然后你使用基于JSON返回一个for循环迭代对象的长度,因为对象没有一个长度for循环从未运行。

您要么期待有长度属性的数组,但是由于数据类型设置为JSON,所以它们不会进入,或者您期待的对象将作为JSON对象来到,而JSON对象不会有一个长度属性,并且必须与for(key in object)$.each(object, function(key, value) {...})等循环。

+0

我是一个总的新手,但不JSON工作使用数组吗?我通过http://jsonlint.com/验证了我的json生成的数据,所以我期望它应该没问题......我会在每次请求时返回json代码的示例来更新我的第一篇文章 – shadow

+0

If它是一个对象,它没有length属性,所以你不能为'(i = 0; i adeneo

+0

我不想打扰你,但for循环有效,因为我可以在每一步看到数据,甚至可以正确构建html var .. – shadow

0

你确定你的HTTP请求实际上是返回一些东西吗? 您可以提供您正在请求的完整URL以及您提供给您的函数的不同参数。

+0

它,我验证了它在我的js代码 – shadow