不,值是“一些”:
<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
});
});
});
为了防止过度缩进,您可以在别处定义回调函数并在此处引用它们。