Javascript 仅在变量不等于null时运行代码

Javascript 仅在变量不等于null时运行代码,javascript,jquery,Javascript,Jquery,我有个问题。我有以下代码: setInterval(function() { $.ajax({ url: url, success: function(data, count){ var obj = jQuery.parseJSON(data); var content = obj.results[0].content; }}) }, 2000) 现在,这段代码每2秒运行一次,并进行ajax调用。我在这一行不断得到obj为空的错误: var co

我有个问题。我有以下代码:

setInterval(function() {
    $.ajax({ url: url, success: function(data, count){
        var obj = jQuery.parseJSON(data);
        var content = obj.results[0].content;
    }})
}, 2000)
现在,这段代码每2秒运行一次,并进行ajax调用。我在这一行不断得到obj为空的错误:

var content = obj.results[0].content;
我很确定这是因为当解析器到达这一行时,parseJson还没有完成。我需要一种方法来说明,尽管obj=null不运行var content=obj.results[0]。content;代码


希望这是有意义的

如果你想对此事直言不讳:

var content = obj && obj.results && obj.results[0] && obj.results[0].content;
但我真的认为这不是问题所在。。只有在完成所有操作后才会调用该回调。JSON解析是同步的。您确定服务器返回的数据正确吗


仅供参考,您还可以为
jQuery.ajax
调用提供
dataType
选项,以便自动完成JSON解析。

如果您想对此进行分析:

var content = obj && obj.results && obj.results[0] && obj.results[0].content;
但我真的认为这不是问题所在。。只有在完成所有操作后才会调用该回调。JSON解析是同步的。您确定服务器返回的数据正确吗


仅供参考,您还可以为
jQuery.ajax
调用提供
dataType
选项,以便自动完成JSON解析。

我不明白为什么该方法应该是异步的

为什么不简单地写一个IF语句,如下所示:

 ...
 var obj = jQuery.parseJSON(data);
 if (obj != null && obj.results != null && jQuery.isArray(obj.results) &&
     obj.results.length > 0 && obj.results[0].content != null) {

   var content = obj.results[0].content;
   /* do some processing */
 }

我不明白为什么这个方法应该是异步的

为什么不简单地写一个IF语句,如下所示:

 ...
 var obj = jQuery.parseJSON(data);
 if (obj != null && obj.results != null && jQuery.isArray(obj.results) &&
     obj.results.length > 0 && obj.results[0].content != null) {

   var content = obj.results[0].content;
   /* do some processing */
 }

可能值得一看数据变量设置为什么,以便了解
jQuery.parseJSON
返回null的原因:

$.ajax({ url: url, success: function(data) {
    console.log(data);
    var obj = jQuery.parseJSON(data);
    var content = obj.results[0].content;
}})
如果您以前没有使用过控制台,请尝试下载

您还可以使用Daniel建议的选项来简化代码:

$.ajax({ url: url, dataType: "json", success: function(data) {
    var content = data.results[0].content;
}})

可能值得一看数据变量设置为什么,以便了解
jQuery.parseJSON
返回null的原因:

$.ajax({ url: url, success: function(data) {
    console.log(data);
    var obj = jQuery.parseJSON(data);
    var content = obj.results[0].content;
}})
如果您以前没有使用过控制台,请尝试下载

您还可以使用Daniel建议的选项来简化代码:

$.ajax({ url: url, dataType: "json", success: function(data) {
    var content = data.results[0].content;
}})

有趣的语法。特别是:
console.log(true&&a)
输出“a”。有没有比执行
更好的方法来强制它充当比较运算符呢!!(true&&'a')
(true&&'a')?true:false
布尔值(true&&a)
-如果是这样,哪一个最好?这也解释了为什么有时我的值的类型不是我所期望的。@balupton:我很少发现有必要将这些表达式转换为布尔表达式,但在这三个表达式中,我认为我更喜欢先使用
布尔
解,然后使用三元运算符。
Boolean
版本似乎不那么冗长,也同样清晰(当然,这是假设您首先知道
Boolean
的功能)。尽管使用
Boolean
方法,很有可能有人顽皮,决定用伪造的函数或值替换Boolean。为了两全其美,您可以将三元运算符版本包装在函数调用中,使其既安全又清晰。设置数据类型似乎已经完全修复了它。但此代码不起作用:var content=obj&&obj.results&&obj.results[0]&&obj.results[0].content;解析是如何同步的?当然,ajax成功函数会运行,然后解析json。我确信此行-var content=obj.results[0].content;-在json解析之前运行,这就是为什么它为null。谢谢你的修复。@elduderino:我给你的代码最多只能抑制错误。您可以判断解析是同步的,因为您将它分配给了一个变量:
obj
。它在解析完成之前无法继续,因为它计算函数调用。我认为真正的问题是jQuery已经在隐式地为您解析JSON(它尝试基于mime类型进行猜测,等等)。因此,您正在将已经是JS对象的
数据
传递到
parseJSON
,当传入非JSON字符串的内容时,该对象返回null/undefined。有趣的语法。特别是:
console.log(true&&a)
输出“a”。有没有比执行
更好的方法来强制它充当比较运算符呢!!(true&&'a')
(true&&'a')?true:false
布尔值(true&&a)
-如果是这样,哪一个最好?这也解释了为什么有时我的值的类型不是我所期望的。@balupton:我很少发现有必要将这些表达式转换为布尔表达式,但在这三个表达式中,我认为我更喜欢先使用
布尔
解,然后使用三元运算符。
Boolean
版本似乎不那么冗长,也同样清晰(当然,这是假设您首先知道
Boolean
的功能)。尽管使用
Boolean
方法,很有可能有人顽皮,决定用伪造的函数或值替换Boolean。为了两全其美,您可以将三元运算符版本包装在函数调用中,使其既安全又清晰。设置数据类型似乎已经完全修复了它。但此代码不起作用:var content=obj&&obj.results&&obj.results[0]&&obj.results[0].content;解析是如何同步的?当然,ajax成功函数会运行,然后解析json。我确信此行-var content=obj.results[0].content;-在json解析之前运行,这就是为什么它为null。谢谢你的修复。@elduderino:我给你的代码最多只能抑制错误。您可以判断解析是同步的,因为您将它分配给了一个变量:
obj
。它在解析完成之前无法继续,因为它计算函数调用。我认为真正的问题是jQuery已经在隐式地为您解析JSON(它试图猜测bas)