2011-04-11 201 views
1

对于标题我很抱歉,我只是不确定如何描述这个。IF语句中的Javascript对象声明

基本上我使用JQUERY/ajax来调用一个php脚本来验证一些输入并获取一些数据。返回的数据编码为JSON,因此我在JQUERY中将数据类型设置为JSON,并返回一个对象。

我刚刚发现,在某些网络连接没有以预期的方式响应的情况下(它必须说是不寻常的),ajax调用会调用JQUERY中的错误选项。

在大多数情况下,我从服务器返回一条错误消息,但有时会出现错误,并且没有从服务器端脚本发回JSON。我还没有完全追查到究竟会导致网络状况的原因,但无论如何,我认为我只是用Javascript处理它,而我还不知道。

这个想法是检查是否已经创建了期望的对象,如果没有,然后创建它与两个预期的属性并运行对话。这样我会避免重复编写错误消息。这不是一个很大的节约,但我想尝试这个原则。

$.ajax({ 
     url: 'getmetadata.php', 
     type: "POST", 
     data: entereddata, 
     dataType: "json", 
     timeout: (7000), //wait 7 seconds 

     error: function(data) 
     { 
     // handle errors 
     if(data) 
     { 

     // Do nothing error message will be issued from the data object 
     }else{ 
        // no message was returned. Some other error occured. 
      function tempdata() 
      { 

       this.errortitle = "Error title"; 
       this.errormessage = "Error text"; 
      }; 

      var data = new tempdata(); 
     }; 

     // issue error message 
     runDialogue(data.errortitle,data.errormessage); 

     }, //ERROR 

     success: function(data) 
     { 
     }; // SUCCESS 
}); // AJAX 

在上面的代码中,数据对象应该存在或不存在于“if”语句之前。当我到达runDialogue()时;对象数据应该始终存在以便通过errortitle和errordescription属性。

当“数据”对象存在时,没有问题。什么是不工作是什么时候“数据”对象不存在,即如果“如果”测试失败。其他应该创建对象“数据”,但没有。

我做错了什么?

回答

3

你是重新定义你的其他块变量数据(更具体范围),因此在全球范围内变量仍然是不确定的。 更改var data = new tempdata();到

data = new tempdata(); //In the else block 

所以,现在你的Ajax调用应该是这样的:

$.ajax({ 
      url: 'getmetadata.php', 
      type: "POST", 
      data: entereddata, 
      dataType: "json", 
      timeout: (7000), //wait 7 seconds 

      error: function(data) 
      { 
      // handle errors 
      if(data) 
      { 

      // Do nothing error message will be issued from the data object 
      }else{ 


       /******************NOTE THE CHANGE HERE********************/ 
       data = { 

        errortitle:"Error title", 
        errormessage:"Error text" 
       }; 

      }; 

      // issue error message 
      runDialogue(data.errortitle,data.errormessage); 

      }, //ERROR 

      success: function(data) 
      { 
      }; // SUCCESS 
    }); // AJAX 
+1

此外,在“else”子句中定义该函数非常可疑。 – Pointy 2011-04-11 20:33:33

+0

我没有定义一个函数。它是一个对象,只有在它尚未退出时才应该定义它。 – T9b 2011-04-11 20:38:21

+0

@Pointy::)将函数调用更改为对象分配 – Chandu 2011-04-11 20:38:25

0

的Javascript抛出未定义引用的错误;你不能仅仅使用该对象来测试存在。您可以使用typeof运算符来测试数据是否存在,或者是否是“object”类型。

例如:

if (typeof data === "undefined") 
{ 
    // You don't really need a closure for this... 
    errordata = {'errortitle' : 'Error Title', 
       'errormessage' : 'Error Message'}; 

runDialogue(data.errortitle, data.errormessage); 
} 
0

当$就失败(因为一个HTTP错误的),则.error方法被称为通过如下PARAMS: 误差(jqXHR,textStatus,errorThrown)

所以你称之为“data”的第一个参数不是“web服务器发给你的东西”,而是一个jquery包装的xmlhttprequest对象。通过“if”测试它[例如,如果(data)]将总是返回true。

+0

这并非总是如此,当您使用“数据类型”选项,因为我发现。 Cyber​​nate的答案是有效的 - 这意味着如果(数据)可以返回false。例如,如果你使timeout = 1。 – T9b 2011-04-11 20:48:36

+0

嗯真的吗?我用timeout = 1试了一下,它总是碰到if的“true”块。耸肩。 – James 2011-04-11 21:09:05

+0

正如我所说这是一个很奇怪的问题。我对开发服务器端超时过了,我发现,甚至模拟了类似的结果的唯一途径(“结果”并不意味着它是一样的实际问题)是jQuery的超时时间减少为1。 reall问题只发生了一次大约半个小时,我唯一可以做出的结论是ISP没有响应。路径中的其他设备(devmachine> router> modem> internet)都亮起绿灯,但ISP在网络检查中显示为红色。我猜我的ISP可能已经关闭了,并且认为我应该为我的用户处理这个错误。 – T9b 2011-04-13 09:39:37