我创建了一些小的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:无法读取属性'名词'未定义的
答案 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!
});
}}