有没有办法让jQuery的post
方法等待服务器端代码完成?
在下面的示例中,post
并未等待我的php
脚本完成。虽然php
正在调用sleep(10)
,但post
会立即返回,导致javascript
清除#temsg中的值并过早更改$ sendmsg的文本。
$('#sendmsg').click(function() { $("#sendmsg").html("sending...."); var msg = $("#temsg").val(); var to_id = 123; $.post("http://localhost:8888/ci/index.php/members/addMessage", {message: msg, tomember: to_id}, function(data){ $("#temsg").val(''); $("#sendmsg").html("Leave Message"); },'json'); $("#infomsg").show(); $("#infomsg").html("Message Sent!"); setTimeout(function() { $("#infomsg").hide('slow'); }, 3000); });
答案 0 :(得分:2)
Ajax是异步。代码保持运行的事实并不意味着没有发生睡眠。
服务器上的那个线程“休眠”,而javascript
继续执行下一行。
示例如何使用async:false
:
$.ajax({
url: "http://localhost:8888/ci/index.php/members/addMessage",
async: false,
data: {message: msg, tomember: to_id},
dataType: 'json',
success: function(data){
$("#temsg").val('');
$("#sendmsg").html("Leave Message");
}
});
ajax
docs
答案 1 :(得分:2)
Ajax(应该是)异步 - 这意味着$.post()
方法是非阻塞的并且立即返回并且您的函数的其余部分继续执行,然后最终在响应返回success
处理程序被调用。
您可以通过执行同步(阻塞)请求使JS代码暂停直到Ajax请求返回,但是假设(大多数)浏览器在与UI相同的线程上运行JavaScript,这意味着在响应回来之前,浏览器不会响应任何事情,这对用户来说太可怕了 - 实际上浏览器将被锁定服务器端代码正在睡眠的十秒钟。
解决方案是坚持使用默认的异步请求,但在$.post()
调用之后将代码移到成功处理程序中:
$('#sendmsg').click(function() {
$("#sendmsg").html("sending....");
var msg = $("#temsg").val();
var to_id = 123;
$.post("http://localhost:8888/ci/index.php/members/addMessage",
{message: msg, tomember: to_id},
function(data){
$("#temsg").val('');
$("#sendmsg").html("Leave Message");
$("#infomsg").show();
$("#infomsg").html("Message Sent!");
setTimeout(function() { $("#infomsg").hide('slow'); }, 3000);
},'json');
});