0

这是代码:-

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.

我无法在这里访问测验,我有什么任务吗?,这有什么问题?

4

4 回答 4

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这称为闭包。您的回调函数在范围周围关闭,并将其带到下一个事件中。

于 2012-04-13T21:23:04.437 回答
1

AJAX 调用是异步的,您应该等待结果从服务器返回。要么在回调函数中完成所有工作,要么查看 Promise 库(我喜欢Q Promise库),这使得等待 AJAX 结果变得非常容易。

于 2012-04-13T21:22:37.383 回答
0

这是由于 JavaScript 的异步特性,一旦你调用startQuiz()它就会执行并跳回并执行你的测验 alert()。

您必须在调用回调后显式访问您的测验数据,以确保您可以访问它。

您还必须担心范围,因为您可能实际上并未修改相同的测验变量。

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表示异步。

于 2012-04-13T21:25:57.353 回答
0

你应该给 jQuery deferreds 一个尝试,这是自 jQuery 1.5 以来编写 ajax 相关代码的首选方式:http: //javascriptplayground.com/blog/2012/04/jquery-deferreds-tutorial

一旦你掌握了它的窍门,可能会更容易编写和理解你的代码。

于 2012-04-13T21:47:58.390 回答