我有一些关于 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 毫秒的顺序排列它们。确保有足够的时间让回调检索。虽然这当然仍然不可靠,但我想我会改变这方面的要求。