1

所以标题有点说明会发生什么。我有一个 ajax 调用,如果成功,它会发送另一个调用,但问题是在调用完成之前它已经发送了另一个调用,并且 ajax 开始堆叠。我没有使用异步,而是使用php作为我的服务器语言。我的 ajax 也有 5 秒 = 5000 毫秒的超时。所以它轮询服务器,当它发生时它正在等待,然后 javascript 执行一个新的 ajax 调用,甚至在另一个返回信息之前。

所以这是我的 jquery ajax 调用

 $.ajax({
                url: ("json/getfriends.php"),
                type: 'POST',
                data: {friendlist: friendsarray},
                async: false,
                timeout: 5000,  
                dataType: 'json',       
                success: function(data){                
                    $.each(data, function(i, val){
                        friendsarray.push(val);                 
                    });
                    setTimeout("friends();", 15000); //loops the ajax call

                },
                error: function(jqXHR, textStatus, errorThrown) 
                {
                    if (errorThrown['code'] == 101){
                        //time out, not data was received 
                        setTimeout("friends();", 15000); //loops the ajax call
                    }
                    else
                    {
                        console.log(errorThrown);
                    }
                }
            });

所以我的问题是如何停止 ajax 堆叠在彼此之上,或者如何让一个 ajax 调用仅在另一个调用带回数据时才进行。

所以这是一个图像 和后果

我完整的 javascript

4

1 回答 1

1

底线是,您显示的代码没有出现问题。

但是,您添加的完整 JavaScript存在一个主要问题:

...
setTimeout(chat_check(), 20000);    
...

看到了吗?它立即chat_check()从成功处理程序中运行。不是个好主意!

应该是这样的:

setTimeout(chat_check, 20000);

它将函数引用作为第一个参数传递,而不是函数结果。您可能希望为您的friends()通话应用相同的内容:

setTimeout(friends, 15000);

编辑

顺便说一句,我不确定您为什么要使用async: false,但是这样做对用户体验来说并不是很好,因为浏览器在请求期间将无响应。

使用默认异步模式会更好:)

于 2012-12-15T22:15:14.413 回答