0

我有一些关于 javascript 的问题。这会导致一些问题。我正在使用 DevExpress MVC GridView、ASP.Net MVC 3 和 javascript。

这是我的问题:

我有一个gridview,例如客户。我希望他们选择客户,并将它们显示在由 javascript 生成的表格中,这样我们就不会得到所有这些刷新。然后他们可以添加其他信息,以便可以再次将它们保存到另一个表中,但这并不重要。

在从所选客户生成表格行之前,我执行了一些计算。另一个问题是,devexpress gridview 有一个事件会调用每个选择更改,而不是等待约 100 毫秒,这样用户就可以快速多选而不触发方法 3/4 次。

我通过数组跟踪我自己的表。DevExpress 的 GridView 有他自己的事件,可以给我正确的信息,所以不用担心。所以我得到了一个方法 receiveSelectionFields(Values){ //do something },我从每个选择的 gridview 接收该信息。然后我检查我的数组,看看他们是否添加或删除了选择,以及哪些。然后我调用 addtablerow(customer) 或 removetablerow(customer)。这会将客户从我的表中删除,然后从我的数组中删除。

因为我在两者之间进行了一些繁重的计算,所以在计算完成之前有大约 60 毫秒的延迟(在我的计算机上)。因此,如果用户在 60 毫秒内做出 2 次选择。我的数组将有错误的值(不会被添加/删除客户的第一个调用修改),并且我的 javascript 将导致错误,例如未删除表行。我检查我自己的数组的长度和接收到的数组的长度,看看是否添加或删除了某些东西。

那么我尝试了什么?使我的方法成为递归方法,当问题发生时,它会等待 60 毫秒,然后重做该方法。但这不能正常工作。

我尝试添加一个全局变量busy,当方法仍然很忙时这是真的。结束时为假。但是我的浏览器在这样做时就退出了。这是代码:

    while (true) {

        setTimeout(function () {
            if (busy === false) {
                break;
            }
        }, 50);
    }

但我觉得它只是无休止地循环。

这些都是变通方法,必须有一个很好的方法来解决这个问题。有什么想法吗?

简而言之:我想要一种让功能同步运行的方法。即使它们被称为异步。由用户,这样我的阵列就不会搞砸。

找到了为什么我的问题存在的答案:因为 javascript 是同步的。语言(1 个线程)。这些功能应该在正确的时间触发。问题是来自 DevExpress Gridview for MVC Extensions 的回调。它对服务器进行回调,该服务器在大约 150 毫秒内响应选定的字段值。如果您快速触发 devexpress 函数两次,这将产生错误。第二个触发器有一个比第一个触发器返回更快的窗口。这意味着我的表格编码被破坏了,因为我检查了是否添加或删除了某些东西。因此,当第一个触发器(在第二个触发器后返回)和我的表被更新时。它显示了我上次选择之前的表格。因此缺少 1 行或多 1 行,那么它应该有。

所以我必须创建一个函数来检索所有事件,然后在每个订单后按约 200 毫秒的顺序排列它们。确保有足够的时间让回调检索。虽然这当然仍然不可靠,但我想我会改变这方面的要求。

4

1 回答 1

1

您的 while 循环条件为真,因此循环将无休止地继续。您可能想尝试以下方法:

var int = setInterval(function () {
    if(busy === false) {
        clearInterval(int);
    }
}, 50);

试试这个,而不是一遍又一遍地循环 setTimeout。如果我不得不猜测,break 会破坏 if 语句,而不是 while 循环,导致浏览器陷入无限循环。使用上面的代码,您可以设置运行代码的时间间隔。在这种情况下,代码每 50 毫秒运行一次。一旦 if 语句中的条件为真,setInterval 就会被清除,导致浏览器继续执行其正常功能。

希望这可以帮助。

于 2012-10-04T13:50:53.810 回答