使用post的JQuery Ajax - 它是阻塞的吗?

时间:2012-02-12 03:50:17

标签: php jquery ajax

有没有办法让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);
});

2 个答案:

答案 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');
});