Ajax请求和转换问题

时间:2015-05-08 11:09:15

标签: jquery ajax

我有这个代码从数据库中提取新消息, 问题是:有时ajax请求花费的时间太长,并且它会将相同的消息拉两次。

将间隔设置为较长时间有一个简单的结果,但即使我会做很长时间(约5秒),它有时也可能会出现同样的问题。

如何确保不再发生任何想法?

我认为最好的方法是检查getNewMessages是否在ajax请求的中间,如果是 - 避免发送另一个请求。

function getNewMessages() {
    $.ajax({
        url: "@string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"))Chat/GetNewMessages",
        data: {
            LastID: lastId
        },
        type: "POST",
        dataType: "text",
        success: function (text) {
            var arr = jQuery.parseJSON(text);
            var arrLength = arr.length;
            if(arrLength != 0)
                lastId = arr[arrLength - 1]["Id"];

            for (i = 0; i < arrLength; i++) {
                var extraClasses = "";
                if (isUnicode(arr[i]["Message"])) {
                    extraClasses = "rtl";
                }
                if (arr[i]["UserID"] == UserID)
                    $(".messages").append("<div class='ownMessage messageNickname' id='" + arr[i]["Id"] + "'><div class='row nickname'><div class='col-md-12'>" + arr[i]["Nickname"] + "</div></div><div class='row message " + extraClasses + "'><div class='col-md-12'>" + arr[i]["Message"] + "</div></div></div>");
                else
                    $(".messages").append("<div class='messageNickname' id='" + arr[i]["Id"] + "'><div class='row nickname'><div class='col-md-12'>" + arr[i]["Nickname"] + "</div></div><div class='row message " + extraClasses + "'><div class='col-md-12'>" + arr[i]["Message"] + "</div></div></div>");
            }

            if (arrLength > 0) {
                $(".messages").animate({ scrollTop: $(".messages").prop("scrollHeight") }, 2000);
            }
        }
    });
    $(".messageNickname").dblclick(removeMessage);

}

setInterval(getNewMessages, 2000);

1 个答案:

答案 0 :(得分:0)

使用标志变量。

var doingRequest = false;
function getNewMessages() {
    if (!doingRequest) {
        $.ajax({
            beforeSend: function(){
                doingRequest = true;
            },
            complete: function(){
                doingRequest = false;
            }
     });
}