-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>
4

4 回答 4

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 代码的执行都会等到您的请求完成并且您的页面同时冻结。

于 2013-01-15T17:15:41.213 回答
0

警报No. 2应该首先使用 value 触发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);
});

用于同步请求。

于 2013-01-15T17:16:21.387 回答
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 的一个很好的介绍:编写异步 Javascript 101

于 2013-01-15T17:17:37.000 回答
0

由于 $.get() 是一个异步调用,一旦控制到达那里它就会被触发,并且由于它本质上是异步的,所以它不需要等待完成调用。所以控制转移到你的下一个警报(并且ajax调用可能仍在完成的路上)。

于 2013-01-15T17:18:48.260 回答