Javascript 如何验证ajax服务器的计算结果是否与用户的UI操作匹配?

Javascript 如何验证ajax服务器的计算结果是否与用户的UI操作匹配?,javascript,ajax,asp.net-mvc,hash,Javascript,Ajax,Asp.net Mvc,Hash,我有一个表单,用户可以通过选中复选框来选择一系列值。 有两个复选框列表,一个使用整数作为值,另一个使用字符串 问题是,我需要根据用户在复选框中选择的值向用户提供一些计算结果。 这个计算可能非常慢,从2到20秒不等 当前,计算值的ajax请求在用户选中任何复选框时执行。但这会导致对他们单击的每个复选框的请求。每个请求返回的计算结果有时会以错误的顺序到达,这意味着最慢/最后到达的响应就是呈现给用户的响应 我似乎不需要验证对用户选择的值的响应,只在结果与所选复选框匹配时才显示结果。 我认为哈希值是解决

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

问题是,我需要根据用户在复选框中选择的值向用户提供一些计算结果。 这个计算可能非常慢,从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个复选框,每个复选框之间的间隔不到1秒,则请求将只执行一次,而不是5次

我真的想要两者的结合

你知道我如何在服务器端和客户端都进行哈希吗?
或者,如果您知道如何用另一种方法解决这个问题,请说出您的想法:)

您可以在jQuery中声明一个全局变量,比如
requestNo
,并在每次ajax调用中发送该变量值,而不是对所选值进行哈希运算并用ajax结果进行检查(每个ajax请求的增量
requestNo
值)


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

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


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

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


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

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


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

尝试使用可视指示器(加载图像)向用户显示服务器中仍在进行计算。 如果您使用的是Ajax.ActionLink,请使用以下命令:

使用jQuery还有很多方法可以做到这一点。jQuery有ajax方法:
,因此您可以使用ajaxStart和ajaxStop/ajaxComplete来显示和隐藏加载图像。

尝试使用可视指示器(加载图像)向用户显示服务器中仍在进行计算。 如果您使用的是Ajax.ActionLink,请使用以下命令:

使用jQuery还有很多方法可以做到这一点。jQuery有ajax方法:
,因此您可以使用ajaxStart和ajaxStop/ajaxComplete来显示和隐藏加载图像。

这不是我使用的解决方案,但这似乎是一个很好的解决方法。看看我的答案,我用的解决方案。这不是我用的解决方案,但这似乎是一个很好的解决方法。看看我的答案,看看我使用的解决方案。某种视觉加载指示器是非常重要的,那种似乎什么都没有发生的感觉非常糟糕,人们讨厌它。但是添加一个小图片会让他们更有耐心。没错,但我认为加载图像不会隐藏,直到最后一个请求的响应返回,所以你不需要检查任何值或使用哈希方法来确保结果是正确的。某种视觉加载指示器非常重要,那种似乎什么都没发生的感觉很可怕,人们讨厌它。但添加一个小图片会让他们更有耐心。没错,但我认为加载图像不会隐藏,直到返回最后一个请求的响应,所以您不需要检查任何值或使用哈希方法来确保结果是正确的。