如何处理"未捕获的TypeError:无法设置属性' prop'未定义"在getJSON上调用?

时间:2016-04-25 20:06:57

标签: javascript jquery json

我有一个HTML来调用REST Web服务并获得JSON答案。 当我输入错误的参数时,我可以毫无问题地捕获错误,但有时JSON上的某些结果为空。我怎么能抓住这种情况呢?

我的HTML:

<div id="divname"></div>

我的javascript:

$.getJSON(URL, function(data) {
             $('#divname').html(data.result[0].dest[0].pred[0].time);
     })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); $('#divname').html('Wrong Parameter.'); })
.always(function() { alert('getJSON request ended!'); });

一个好的JSON结果是这样的:

{
    "result": [{
        "string01": "104",
        "string02": "104 - blablabla",
        "string03": "104",
        "string04": "blobloblo",
        "string05": "blablabla",
        "dest": [{
            "pred": [{
                "time": 1461348846,
                "sec": 102,
                "min": 1,
                "string11": "514-String",
                "string12": "Some String",
                "string13": "Some other String",
                "number": 0
            }]
        }]
    }]
}

但有时,当没有数据显示时,我会得到这样的结果:

{
    "result": [{
        "string01": "104",
        "string02": "104 - blablabla",
        "string03": "104",
        "string04": "blobloblo",
        "string05": "blablabla",
        "dest": [{"pred":[]}]
    }]
}

我在chrome控制台中获得以下内容:

Uncaught TypeError: Cannot set property 'time' of undefined

我理解为什么会失败,但我不知道如何捕获此错误以显示失败的HTML。

1 个答案:

答案 0 :(得分:1)

添加对pred长度的检查:

$.getJSON(URL, function(data) {
   if (data.result[0].dest[0].pred.length) {
       $('#divname').html(data.result[0].dest[0].pred[0].time);
   } else {
       // handle the case with empty pred here
   }
     })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); $('#divname').html('Wrong Parameter.'); })
.always(function() { alert('getJSON request ended!'); });

或者,检查pred [0]是否未定义:

$.getJSON(URL, function(data) {
   if (typeof data.result[0].dest[0].pred[0] !== 'undefined') {
       $('#divname').html(data.result[0].dest[0].pred[0].time);
   } else {
       // handle the case with empty pred here
   }
     })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); $('#divname').html('Wrong Parameter.'); })
.always(function() { alert('getJSON request ended!'); });