AJAX请求成功3次,然后失败

时间:2014-01-27 05:30:03

标签: javascript php jquery ajax

我正在使用以下脚本将即时消息异步提交到我的数据库。

function sendMessage(content, thread_id, ghost_id)
{
    var url = "ajax_submit_message.php";
    var data = { content: content, thread_id: thread_id };
    var type= "POST"; 

    $.ajax({
        url:url,
        type:type,
        data:data,
        success:function(){ unGhost(ghost_id); refreshMessages(); },
        error:function(){alert("FAIL");}
     });
}

这在正常情况下的行为完全符合预期,但是当我在我的PHP脚本中添加'sleep(10)'以试图找出它在繁重的服务器负载下如何工作时,我发现该脚本只能处理一个在它中止之前几乎没有请求。

该脚本将完成三个成功的请求,但在第四个上它将每次都失败。它不会调用错误函数,而是调用成功函数。我不知道如何调试它,因为在任何地方都没有抛出任何类型的错误或异常。谁能告诉我可能是什么造成的?

编辑:由于请求,这里是我如何调用该函数:

function checkKey(e)
{ 
    if (e.keyCode == 13) 
    {
        //Get message and thread_id
        var message_field = $(':focus');

        //Validate and escape content
        var content = message_field.val();
        if (content == "") {return;} 

        //Grab thread_id
        var id = message_field.attr('id');
        var last_underscore = id.lastIndexOf("_");  
        var thread_id = id.substring(last_underscore+1);

        //Clear input
        message_field.val("");

        //Add message to page
        var ghost = insertGhost(thread_id,content,window.user_id);

        //Send message on to server
        sendMessage(content,thread_id,ghost);
   }
}

2 个答案:

答案 0 :(得分:3)

如果您定期轮询(而不是在每次操作后手动排队轮询),您可能会遇到超时行为。可能第四个没有失败,实际上第四个是成功的,第五个是默默地失败。

原因如下:浏览器一次最多允许两个并发请求到给定主机。任何其他请求都将放入对您的应用程序透明的队列中。但是,这些AJAX请求超时。所以前两个都很好。接下来的两个必须等待一段时间,但是在超时适用之前它们会被发送和接收。后续版本已添加到浏览器的队列中,但由于它们在发送之前超时,因此您看不到任何活动。

你可以通过确保在成功/失败时执行setTimeout来测试这一点,或者通过其他一些方法来管理你在任何时候有多少未决请求

答案 1 :(得分:0)

经过一番探索之后,我发现我的PHP脚本实际上超时了,并回复了这条消息:

超过最长执行时间30秒。

这是有道理的,因为那是我正在测试的那种东西。我发现捕获此错误的唯一方法是让我的PHP脚本在成功时输出“TRUE”,并按如下方式格式化我的AJAX脚本:

$.ajax({
        url:url,
        type:type,
        data:data,
        success:function(msg)
                        {
                            if ($.trim(msg) != "TRUE")
                            {
                                //graceful error handling magic
                            }
                            unGhost(ghost_id); 
                            refreshMessages(); 
                        },
        error:function(){alert("FAIL");}
     });

不是我做过的最优雅的事情,但它应该允许我适应服务器过载的情况。

感谢帮助人员!