0

我有一个表单,用户可以通过选中复选框来选择一系列值。有两个复选框列表,一个是使用整数作为值,另一个是使用字符串。

问题是我需要根据用户在复选框中选择的值向用户提供一些计算结果。这个计算可能很慢,从 2 到 20 秒不等。

目前,计算值的 ajax 请求在用户选中任何复选框时执行。但这会导致对他们单击的每个复选框的请求。并且每个请求返回的计算结果有时会以错误的顺序到达,这意味着最慢/最后到达的响应是呈现给用户的响应。

我似乎不必验证对用户选择的值的响应,仅在与所选复选框匹配时才显示结果。我认为哈希值将是解决此问题的最佳方法。但是我在用 C# 和 javascript 中的实现找到合适的哈希函数时遇到了一些麻烦。

我知道在返回结果时我可以只返回用户操作,但我仍然需要比较所有值,并且值的数量可能非常大。

最佳我想在服务器上生成所选值的哈希,然后在返回结果时在客户端上生成当前所选值的哈希,然后比较两者将指示结果是否与所选值匹配。

像这样的东西:

$.ajax({
  type: 'POST',
  url: '/Backend/GetCalculatedResult',
  data: { CheckedIntegers: checkedIntegers, CheckedStrings: checkedStrings },
  success: function(data) {
        if(ResultMatchesSelection(data.SelectionHash)) {
            DisplayResult(data.Result);
        }
  },
  dataType: "json",
});

function ResultMatchesSelection(hash)
{
    var selectionHash = .. generate hash from selected items;
    return hash == selectionHash;
}

通过在最后一个用户操作后 1 秒执行 ajax 请求,我已经对这个问题进行了部分修复。因此,如果用户依次选中 5 个复选框,每个复选框之间的间隔不到一秒,则请求只会执行一次,而不是 5 次。

我真的很想将两者结合起来。

您知道如何在服务器端和客户端进行这种哈希处理吗?或者,如果您对如何以其他方式解决此问题有想法,请说出您的想法:)

4

3 回答 3

2

您可以在 jQuery 中声明一个全局变量,例如requestNo,并在每次 ajax 调用时发送该变量值(requestNo每个 ajax 请求的增量值),而不是散列选定的值并用 ajax 结果检查它们。

当您返回 ajax 响应而不是散列值时,返回requestNo您通过 ajax 请求收到的值。在客户端检查requestNoajax 响应是否与当前requestNo值相同,如果相同则显示结果。

于 2012-10-12T09:11:49.360 回答
1

尝试使用视觉指示器(加载图像)向用户表明服务器中仍在进行计算。如果您使用的是 Ajax.ActionLink,请使用:http: //msdn.microsoft.com/en-us/library/system.web.mvc.ajax.ajaxoptions.loadingelementid (v=vs.108).aspx

还有很多方法可以做到这一点,使用 jQuery.jQuery 有 ajax 方法: http ://www.w3schools.com/jquery/jquery_ref_ajax.asp ,所以你可以使用 ajaxStart 和 ajaxStop/ajaxComplete 来显示和隐藏你的加载图像。

于 2012-10-12T10:52:42.160 回答
0

我采取了另一条路线,这似乎很好地解决了这个问题。我没有检查值,而是保存最后一个 ajax 请求,每次发生操作时,它都会检查最后一个请求是否仍在加载,如果是,则中止,并发送新请求。

如果我相信它会确保两个请求不能同时挂起,这应该可以很好地解决问题:)

于 2012-10-12T10:23:30.947 回答