以下是代码: -
var quiz;
function startQuiz() {
$.ajax({
url: 'get_quiz/',
cache: 'false',
dataType: 'json',
async: 'false',
success: function(data) {
quiz = data;
alert(quiz[0].q); // I'm able to access quiz here
},
}
);
}
startQuiz();
alert(quiz[0].q); // Not able to access it here.
我无法在这里访问测验,我的任务是什么?,这有什么不对吗?
答案 0 :(得分:2)
Ajax是异步的,可能是一个不熟悉的概念。您的代码将如下运行:
1. var quiz;
2. define function startQuiz;
3. call startQuiz;
4. do ajax call (and continue! don't block)
5. alert(quiz[0].q); // Not able to access it here.
-- ajax call comes back
6. quiz = data;
7. alert(quiz[0].q); // I'm able to access quiz here
Ajax是异步的,它不会阻塞。这意味着当你进行ajax调用时,回调实际上不会被调用,直到ajax调用返回,它不会阻塞并等待。相反,代码将继续。
然后,当ajax调用返回数据时,将执行回调函数。
Javascript通过事件循环来实现这一点。
看起来像这样:第1-5步是第一个事件的一部分。 6-7是第二次活动的一部分。
关于JavaScript的一个很酷的事情是,在你的回调中,你仍然可以访问任何上面的它(比如变量quiz
),因为它有范围。这称为闭包。你的回调函数在范围内关闭,并将它带到下一个事件中。
答案 1 :(得分:1)
AJAX调用是异步的,您应该等待结果从服务器返回。要么在回调函数中完成所有工作,要么查看promises库(我喜欢Q promises库),这使得等待AJAX结果非常容易。
答案 2 :(得分:0)
这是由于JavaScript的异步特性,一旦你调用startQuiz()
它就会执行并跳回来执行你的测验警报()。
您必须在调用回调后显式访问您的测验数据,以确保您有权访问它。
您还必须担心范围界定,因为您可能实际上并未修改相同的测验变量。
var quiz,
fetched = false;
$.ajax({
//blah
success : function(data){
fetched = true;
quiz = data;
}
});
setInterval(function(){
if(fetched){
//quiz is populated
}else{
//quiz hasn't be populated yet
}
},50);
虽然不是一个聪明的例子,但我只是试图明确startQuiz()
并不等待ajax调用。 AJAX中的 A 意味着异步。
答案 3 :(得分:0)
你应该尝试jQuery deferreds,这是自jQuery 1.5以来编写ajax相关代码的首选方式:http://javascriptplayground.com/blog/2012/04/jquery-deferreds-tutorial
一旦掌握了它,可能会更容易编写和理解您的代码。