关于在domEngine和canvasEngine方法中遍历runningList的疑问
lynxerzhang opened this issue · 2 comments
lynxerzhang commented
/* eslint no-invalid-this: 0 */
var domEngine = function() {
var dn = Date.now() / 1000;
var ct = this._hasMedia ? this.media.currentTime : dn;
var pbr = this._hasMedia ? this.media.playbackRate : 1;
var cmt = null;
var cmtt = 0;
var i = 0;
for (i = 0; i < this.runningList.length; i++) {
cmt = this.runningList[i];
cmtt = this._hasMedia ? cmt.time : cmt._utc;
if (ct - cmtt > this.duration) {
this.stage.removeChild(cmt.node);
/* istanbul ignore else */
if (!this._hasMedia) {
cmt.node = null;
}
this.runningList.splice(i, 1);
}
}
你好,在查看代码的过程中有一个疑问,上面代码段中对runningList进行循环判断并删除指定元素,遍历中调用splice方法会导致runningList.length产生变化,可能导致后继的判断删除问题。
如下从最后一个元素开始判断则可以避免
for (i = runningList.length - 1; i >= 0; i--) {
//......
this.runningList.splice(i, 1);
}
请查看是否存在该问题?
weizhenye commented
确实,删除一个元素后,会跳过该元素后一个元素判断。
不过由于这里是删除已出屏的弹幕,漏删对实际效果没什么影响,下一个 frame 就会删掉了。
你愿意的话可以发一个 PR,也可以晚点我改一下。
lynxerzhang commented
好的,我发了一个PR,修改了engine目录下的canvas.js和dom.js,请查看是否符合要求。