2013-01-15 27 views
-2

我有以下JavaScript代码,我试图从WebAPI项目中的某个操作获取一些数据。我遇到的问题是,当我使用数据集变量时,出现错误,指出该数据集未定义。另外,我希望我的警报1号先发射,但是2号警报首先发射,数据集未定义,然后2号警报发射,然后它包含我的数据。我在这里做错了什么?

<script type="text/javascript"> 
    $().ready(function() { 
     var dataset; 
     $.get("http://localhost:9619/api/values", function(data) { 
      dataset = data; 
      alert("No. 1 " + dataset); 
     }); 

     alert("No. 2 " + dataset); 
    }); 
</script> 
+2

这是由于AJAX的异步性质。 SO在这里有几百万个帖子来解决这个问题。 –

+1

由于“Ajax”的“A”部分,它发生“无序”。 –

+0

[你如何让JavaScript代码执行\ *依次为*](http:// stackoverflow。COM /问题/ 2637626 /怎么办 - 你 - 做的JavaScript代码,执行,按顺序) –

回答

1

$.get()是异步的。因此,回调的执行会延迟到请求完成。

执行顺序,你的情况是这样的:

1. start the get request 
2. alert("No. 2 "); 
3. [request has finished] execute the callback: alert("No. 1 "); 

您应该添加所有代码的$.get()请求到相应的回调依赖。这样你就可以确保请求已经成功并且你的变量已经设置好了。

另一个不太可取的解决方案是使用$.ajax()并将其参数async设置为false。但在这种情况下,所有JavaScript代码的执行都会等待,直到您的请求完成并且您的页面同时冻结。

0

警报No. 2应首先触发值为undefined,因为ajax请求是异步的。之后,您应该收到来自请求的价值No. 1。你可以通过使用同步ajax请求来获得你期望的行为(不好的做法)。

试试这个:

$().ready(function() { 
    var dataset; 
    $.ajax({ 
     url: 'http://localhost:9619/api/values', 
     success: function(result) { 
        dataset = data; 
        alert("No. 1 " + dataset); 
       }, 
     async: false 
    }); 
    alert("No. 2 " + dataset); 
}); 

同步请求。

0

$ .get是“异步”,因为它不会在继续之前等待它完成。第二个参数是回调函数(这就是你已经把

alert("No. 1 " + dataset); 

什么情况是,当你运行

$.get("http://localhost:9619/api/values", function(data) 

会立即切换到下一行:

alert("No. 2 " + dataset); 

然后当AJAX调用完成时,它将运行回调函数,该函数运行

dataset = data; 
alert("No. 1 " + dataset); 

这里有异步JavaScript一个很好的演示:Writing Asynchronous Javascript 101

0

由于$获得()是一个异步调用它作为控制达到有越来越尽快解雇,因为它在本质上是异步的,它不需要等待才能完成通话。所以控制权转移到你的下一个警报(并且ajax调用可能还在完成中)。

相关问题