有人能解释一下如何在for循环中等待事件完成才能继续下一次迭代吗? 例如:
for ( i=0; i < item.length; i++ ) {
$(video[i]).on('loadeddata', function() {
// do my stuff
})
}
现在,我只是给右侧显示的每个视频添加了一个事件监听器,但显然它们不会以这种方式加载。当它们完成加载并执行其它操作时,由于无法预测,这会破坏页面上显示项的顺序。那么,在
for
循环进入下一次迭代之前,如何使其等待事件完成自己的事情呢?编辑:按要求添加更多信息。实际上我有一个包含HTML元素的对象。这个对象是用
var items = $('.db-gallery-item')
检索到的。正如我所说的,这个对象的值是<div>
元素,包含一个容器<div>
和两个内部元素的图像(<img>
和<a>
),以及单个的<video>
元素。为了保持它们的顺序,必须等待每个元素加载后再进行可见性处理,并继续下一个。解决:成功解决了这个问题,使用了palash提出的解决方案。这是我使用的最终代码。
if(i_length > 0) {
(async function() {
for (i = 0; i < i_length; i++) {
var item = $(items[i]);
if($(item).find('.dbg-video').length == 1) {
var video = $(item[0]).children().children();
if(video[0].readyState > 3) {
item.removeClass('db-are-unloaded');
$grid.masonry('appended', $(item));
}
else {
await new Promise(resolve => video[0].addEventListener('loadeddata', resolve));
$(item[0]).removeClass('db-are-unloaded');
$grid.masonry('appended', $(item[0]));
}
}
else if($(item).find('.db-gallery-image').length == 1) {
await new Promise(resolve => $(item[0]).imagesLoaded().done(resolve));
$(item[0]).removeClass('db-are-unloaded');
$grid.masonry('appended', $(item[0]));
}
}
}());
};
这里是一个JSFiddle的工作示例。