【问题标题】:Add timeout to jQuery AJAX call为 jQuery AJAX 调用添加超时
【发布时间】:2014-04-10 18:30:55
【问题描述】:

作为knockout.js 网格的一部分,我继承了以下内容。

当您单击图像输入时,它会用搜索结果填充网格。

如果服务器超时(比如 30 秒),我希望它重新加载页面,但我对 jQuery 很陌生,不知道从哪里开始。

我可以在代码中看到success,并且找到了很多关于计时的资源,但不确定要测试什么或在哪里测试等等。

如果可以请告知,提前谢谢!

self.submitSearch = function () {
    $("#foundMembersTableParent").block({ message: '<img src="/Content/images/spinnerLarge.gif" /> Searching...' });
    self.selectedMembers.removeAll();
    fnOnSearch();
    $.ajax({
        type: 'POST',
        url: '/Members/MSearch',
        contentType: "application/json; charset=utf-8",
        data: self.getFormData(),
        success: function (data) {
            self.members($.map(data.searchResults, function (item) { return new Members(item) }));
            $("#foundMembersTableParent").unblock();
        },
        dataType: "json"
    });
}

self.getFormData = function () {
    var frmobj = $('#complexSearchForm').serializeObject();
    return JSON.stringify(frmobj);
 }

【问题讨论】:

    标签: jquery ajax knockout.js timeout


    【解决方案1】:

    只需将timeouterror 处理程序添加到您的ajax 请求中:

    $.ajax({
        type: 'POST',
        url: '/Members/MSearch',
        contentType: "application/json; charset=utf-8",
        data: self.getFormData(),
        success: function (data) {
            self.members($.map(data.searchResults, function (item) { return new Members(item) }));
            $("#foundMembersTableParent").unblock();
        },
        dataType: "json",
        timeout: 30000,      // 30 seconds
        error: function(qXHR, textStatus, errorThrown) {
            if (textStatus === "timeout") {
                // request timed out, do whatever you need to do here
            }
            else {
                // some other error occurred
            }
        }
    });
    

    查看文档:https://api.jquery.com/jQuery.ajax/

    作为一个疯狂的猜测,我想你可能正在使用这个插件:

    http://malsup.com/jquery/block/#element

    在这种情况下,在您的 error 处理程序中,您真正需要做的就是:

    $("#foundMembersTableParent").unblock();
    

    恢复网格的功能。当然,您可能还想在某处显示错误消息,以便用户了解表未更改的原因。

    【讨论】:

    • 超时不会重新加载网格,如果查询时间过长它将停止。
    • @user3360944:不 - 这就是为什么我留下评论,OP 可以放置他们想要处理重新加载的任何代码。他们实际上说“重新加载页面”,我怀疑这确实是他们想要的。
    • 我认为他们可以轻松地在错误处理中添加 window.location.reload() ,如果那是“他们真正想要的”,但他们应该让用户知道请求超时。
    • @user3360944:实际上,我怀疑他们需要做的就是删除这行 $("#foundMembersTableParent").block 引入的任何加载屏幕(我假设块来自某种 jQuery 插件)并且可能会弹出一条消息说它超时了。他们还可以恢复 self.selectedMembers 中的任何内容,但如果没有更多上下文,很难说。
    • 当我看到马特扩展他的答案时,我几乎从马特的第一条评论中就知道了。来发现其他代码仍然返回一个空的 json 字符串,所以我还必须在成功函数中测试解析我的返回数据。我正在向 TempData 添加一条警报消息,但需要重新加载页面才能让用户看到它。再次感谢!
    猜你喜欢
    • 2016-09-24
    • 2011-01-31
    • 2013-10-06
    • 2019-10-21
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多