JSON解析错误:无法读取属性

时间:2015-05-11 17:58:18

标签: javascript json

我创建了一些小的jt代码,但它给了我错误

function Mind(){
    var request = "request";
    var reply = "reply";
    var words = '';

    this.Reply = function(){
        if(request == words.nouns[0].noun){
            reply = words.nouns[0].noun;
        }
        else
            reply = this.words.nouns[0].noun;
    }

    this.SetRequest = function(req){
        request = req;
    }

    this.GetReply = function(){
        return reply;
    }

    this.Parse = function(u){
        var xmlhttp = new XMLHttpRequest();
        var url = u;
        var result;
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                words = JSON.parse(xmlhttp.responseText);
            }
        }
        xmlhttp.open("GET", url, true);
        xmlhttp.send();
        return result;
    }

    this.Construct = function(){
        words = this.Parse('mind/words.json');
    }}

    var mind = new Mind();
    mind.Parse('mind/words.json');

这是我的json文件

{
    "nouns": [
        {"noun": "child"},
        {"noun": "father"}
    ]
}

在命令中,一切顺利,但是当我运行此代码时,出现错误

  

未捕获的TypeError:无法读取属性'名词'未定义的

1 个答案:

答案 0 :(得分:4)

多重错误。最基本的一点是你的代码忽略XMLHttpRequest是异步的,并且不会以与#34; regular"相同的方式返回一个值。功能。在这里阅读:How to make a function wait until a callback has been called using node.js。 TL; DR是你必须传入"回调函数"你的解析方法和"返回"使用该函数的值,而不是使用return语句。 Google for" javascript回调"如果这个概念对你来说是新的,请阅读一些教程!

您还有一些小错误,例如从result返回Parse,但从未真正将result设置为任何内容。此外,words在多个地方分配的方式并不合理。但是当你解决同步/异步问题时,这两件事都会消失。

修改

基本上,修复程序如下所示:

this.Parse = function(u, callback){ // this "callback" is new
    var xmlhttp = new XMLHttpRequest();
    var url = u;
    var result;
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            words = JSON.parse(xmlhttp.responseText);
            callback(null, words); // we're "returning" the words here
        }
    }
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
    // no return statement here!
}

this.Construct = function(){
    this.Parse('mind/words.json', function(error, words) {
        // here you can use your words!
    });
}}