我是javascript的新手,我从url获取JSON数据,我只能访问成功函数中的数据,我错过了什么?

时间:2012-04-13 21:13:06

标签: javascript ajax json

以下是代码: -

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 个答案:

答案 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

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