我最近使用MooTools开发了一些简单的AJAX函数。我的问题在于紧随其后的代码:
function changePage(id, url) {
var c = false,
r = null;
for (i = 0; i < history.length; i++) {
if(history[i]['id'] === id) {
console.log('cached');
r = history[i].response;
c = true;
}
}
if(!c) {
makeRequest(url, function(response) {
r = response;
history.push({id: id, response: response});
});
}
changeBackground('_background', {color: r.bgColor, image: r.bgImage});
lightboxContents(generateArticle(r.article.id, r.article.title, r.article.body, r.article.timestamp));
return true;
}
在这里,无论何时执行代码(通过点击进行路由),我都会收到错误“'r'未定义” - 这个陈述在我看来是非常不正确的。
就此而言,我也尝试使用'window'对象用全局变量替换'r' - 同样的问题。
我对这个简单的问题感到困惑,如果有新眼睛的人可以指出我的错误,那将是世界的感激。
感谢您的时间! 蒂莫
答案 0 :(得分:3)
r
很可能是未定义的,因为看起来makeRequest
是异步AJAX调用,这意味着一旦请求完成,其回调函数仅 被调用。由于调用是异步的,因此JS运行时不会在那里等待,并继续执行它后面的语句,在您的情况下是对changeBackground
和generateArticle
的调用。但是,由于此时尚未返回AJAX调用且尚未调用回调,因此r
仍为空。因此,尝试访问r
r.bgColor
上的任何媒体资源都会引发ReferenceError
。
答案 1 :(得分:0)
在您给它一个值之前,似乎您正在尝试使用r
,而它仍然是null
。加载页面时,没有历史记录,因此r
不会获得值。然后你有一个异步函数为r
赋值,但是需要r
来获取值的代码将在异步代码执行之前运行。