1

我正在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不断加载。

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

4

2 回答 2

0

如果我理解正确你的问题是你不能在第一个运行时触发另一个 javascript 调用?这是因为 Javascript 在大多数浏览器实现中都是单线程的。

一些简单的阅读:JavaScript 是否保证是单线程的?

于 2013-05-15T08:10:47.877 回答
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 测试结果

于 2013-05-15T11:50:38.313 回答