我有一个名为 objs 的数组,其中包含我的所有应用程序对象。根据应用程序中发生的情况,在此列表中添加或删除对象。
我遇到这个问题,某些对象有时会消失(或被覆盖)。如果我单步执行添加和删除函数,应用程序始终会按预期运行,但多次在没有调试器的情况下运行时,添加到列表末尾的一两个对象会从列表中消失。
对象被添加到数组中,如下所示:
this.objs[this.objs.length]=obj;
并从数组中删除,如下所示:
for(var i=0;i<this.objs.length;i++)
if(this.objs[i]==obj)
return this.objs.splice(i,1);
我将此代码放在添加和删除函数的末尾:
console.log("add! ");
console.log(this.objs);
链接是 session 期间对象消失的控制台日志的图像:http://ilujin.com/error.png
顶部显示的列表中的前 4 个对象应在整个 session 期间保留在列表中,但索引 3 处的对象(以红色突出显示)会被下一个添加的对象(以蓝色突出显示)覆盖。
另一个奇怪的事情是,显示的第二个列表已经包含了所有更改(删除了 4 个对象,添加了 1 个对象),尽管删除函数只被调用了一次,而添加函数根本没有被调用。
这让我得出结论,问题在于时间 - 如果在调用下一个添加之前一个添加尚未完成,则第一个添加将被覆盖。所有控制台打印都是相同的,因为它们都发生在控制台可以读取和打印之前。
这有道理吗?出于某种原因,我认为 JS 从未运行并行代码,只有在最后一个函数完成后才转向新函数。问题是我在添加到列表时使用 objs 列表的长度作为新索引吗?
如何解决这个问题?我无法弄清楚,调试器和控制台已被证明毫无用处。
这是应用程序:http://iioengine.com/neuro/study2.htm
您只需要输入一个id,看看是否会弹出说明。如果他们这样做了,那么它就会工作并刷新。如果没有,则意味着文本对象被覆盖。
最佳答案
使用 Javascript 的数组方法确实会更好。
添加到数组:
this.objs.push(obj);
从数组中删除:
this.objs.splice(this.objs.indexOf(obj), 1);
另请注意,splice
会编辑原始数组并返回已删除的元素。从有限的代码示例中很难看出,但这也可能会导致问题。
关于JavaScript 项目从数组中消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023052/