1
<input type="text" id="basla" value="some" />


$.get('@Url.Action("BaslangicGetir", "Deneme")' + '?id=' + fisid, function (gelen) {
            $("#basla").val(gelen);
        });

并在获得价值之后

var baslangic = $("#basla").val();
alert(baslangic);

提醒“一些”,但价值不是一些

4

1 回答 1

1

不,值“一些”:

<input type="text" id="basla" value="some" />

当 AJAX 调用完成时,该值将更改为另一个值(可能是也可能不是“一些”,我们无法从这段代码中分辨出来):

$.get('@Url.Action("BaslangicGetir", "Deneme")' + '?id=' + fisid, function (gelen) {
    $("#basla").val(gelen);
});

但是,AJAX 中的“A”代表“异步”,因为这是异步发生的。它可能会在稍后的顺序语句执行之前发生,但不能保证。如果该声明紧跟在 AJAX 请求之后,则不太可能。因此,如果这是完整的代码:

$.get('@Url.Action("BaslangicGetir", "Deneme")' + '?id=' + fisid, function (gelen) {
    $("#basla").val(gelen);
});
var baslangic = $("#basla").val();
alert(baslangic);

那么事件的顺序将是:

  • 向服务器发起 GET 请求。
  • 将当前值(“一些”)存储在变量中。
  • 提醒那个变量。
  • [再过几毫秒,可能会执行此处未显示的稍后代码]
  • 接收来自 GET 请求的响应。
  • 将值设置为来自服务器的新响应。

为了响应 GET 请求中的新值,您必须在该请求的回调函数中执行此操作。因为该函数保证在请求完成后执行。因此,您的陈述的正确顺序是:

$.get('@Url.Action("BaslangicGetir", "Deneme")' + '?id=' + fisid, function (gelen) {
    $("#basla").val(gelen);
    var baslangic = $("#basla").val();
    alert(baslangic);
});

编辑:(根据您的评论)

如果您有多个 AJAX 请求,它们都将异步运行。并且无法保证他们将以何种顺序完成。因此,如果您需要等待三个请求完成,那么一种方法可能是维护一些关于请求状态的标志。也许是这样的:

var completedRequests = 0;

var handleFinalResponse = function() {
    if (completedRequests >= 3) {
        // do whatever you need here after all three are complete
    }
};

$.get(someURL1, function (response) {
    // do something with the response
    completedRequests++;
    handleFinalResponse();
});

$.get(someURL2, function (response) {
    // do something with the response
    completedRequests++;
    handleFinalResponse();
});

$.get(someURL3, function (response) {
    // do something with the response
    completedRequests++;
    handleFinalResponse();
});

认为这里没有竞争条件,但如果有人能找到,请指出,以便我们修复它。本质上,您所做的是存储您从服务器收到多少响应的全局值。因此,无论第三次执行哪个 AJAX 响应,都应该导致执行条件内的代码,以响应所有三个都完成。

如果这不能正常工作(我在同步线程方面没有很多经验,所以我可能忽略了该代码中的一个明显错误),那么另一种选择可能是链接请求,以便每个请求都不会发送直到上一个完成。这种方法速度较慢,但​​更简单:

$.get(someURL1, function(response1) {
    // handle response1
    $.get(someURL2, function(response2) {
        // handle response2
        $.get(someURL3, function(response3) {
            // handle response3
        });
    });
});

为了防止过度缩进,您可以在别处定义回调函数并在此处引用它们。

于 2013-07-01T12:58:12.640 回答