首页 文章

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

提问于
浏览
0

有没有办法让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 回答

  • 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');
    });
    
  • 2

    Ajax是 asynchronous . 代码保持运行的事实并没有发生 .

    服务器上的那个线程"sleeps",而 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

相关问题