ajax请求被阻止,直到服务器返回响应

时间:2013-05-15 07:24:21

标签: php jquery

我正在使用ajax从html页面发送jquery请求,以发送bulk电子邮件并从服务器获取数据。

这是发送批量邮件请求的代码

var sendReq =   $.ajax({
                type: 'post',
                data: "leftID="+JSON.stringify(leftID)+"&rightID="+JSON.stringify(rightID)+"&mode="+mode,
                dataType: 'json',
                url:"bulk.php"


        });

        sendReq.done(function( data ) {


                    $("#bms-ack").html(data.status);
                    $("#bms-ack").fadeIn('slow');
                    $("#bms-ack").fadeOut(6000);

                    console.log(data);
                    console.log("success");

        });

        sendReq.fail(function(jqXHR, data){


                    $("#bms-ack").html(data.status);
                    $("#bms-ack").fadeIn('slow');
                    $("#bms-ack").fadeOut(6000);


                    console.log("fail");


        });

现在的问题是当我向php页面发送请求时,它会发送邮件并回复success消息。

因为php正在将响应返回给客户端,所以这个ajax请求会被阻止吗?因为当我从jqtable发送另一个请求来获取新数据时,需要时间,直到ajax发送批量邮件的先前请求没有完成。最后我的jqtable继续加载。

我如何摆脱阻止请求,我应该从php中删除返回的success消息,如果我这样做,那么用户将如何知道该请求已被提交?

2 个答案:

答案 0 :(得分:0)

如果我理解正确你的问题是你在第一个运行时无法启动另一个javascript通话?这是因为Javascript在大多数浏览器实现中都是单线程的。

一些轻读:Is JavaScript guaranteed to be single-threaded?

答案 1 :(得分:0)

据我所知,如果您发送AJAX请求,则与以非异步方式要求新页面完全相同:只要页面未发送到浏览器,您就会一直等待结果,任何其他请求只是一个刷新。

因此,如果您想实现“非阻塞”AJAX方式,请将AJAX请求发送到“不同”U​​RL。我的意思是:

url:"bulk.php" => Change to url: "bulk.php?v=3"

查询字符串只是一个foo,它只是为了更改你正在调用的URL。

当您要进行AJAX请求时,只需为您正在进行的每个请求添加一个查询字符串(使用?v = X绰绰有余,其中X甚至可能是您正在检索的数据之一,行的id,无论是什么......),它都像魅力一样工作,因为浏览器认为是一个不同的请求,并不阻止你(阻止你)检索PHP文件正在生成的值(虽然你知道值是不同的,因为你发送了不同的数据,:D)

更新

嗯......它应该让你继续工作。只是为了检查,你能尝试下一段代码并告诉我会发生什么吗?

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                for(var $i=0; $i<5; $i++) {
                    $.ajax({
                        type: 'post',
                        url:"ajax.php?v="+$i,
                        success: function(data) {
                            console.log(data)
                        }

                    });
                    console.log('Browser: ' + $i);
                }
            });
        </script>
    </head>
    <body>
        AJAX TEST
    </body>
</html>

AJAX文件:(ajax.php)

<?php
sleep(5);
echo 'WAAAAAAAA';

对我来说,它几乎立即向服务器发送5个AJAX调用(不阻塞行为)。我认为这正是您想要实现的目标,您是否可以测试您的浏览器并告诉我您是否收到了相同的内容?顺便说一句,您可以使用AJAX帖子发布浏览器行为的图像吗?

AJAX Test Result