Может ли кто-нибудь объяснить, как ждать, пока событие завершится sh, чтобы двигаться вперед на следующей итерации внутри для l oop? Например:
for ( i=0; i < item.length; i++ ) {
$(video[i]).on('loadeddata', function() {
// do my stuff
})
}
Теперь с помощью этого кода я просто добавляю прослушиватель событий к каждому видео в правильном порядке, но, очевидно, они не будут загружаться таким образом. Они сделают другие мои вещи, когда они закончат sh загрузку, и потому что это непредсказуемо, это разрушит порядок показанного элемента на странице. Итак, как я могу заставить for
l oop ждать, пока событие завершит свою работу, прежде чем оно перейдет к следующей итерации?
РЕДАКТИРОВАТЬ: я добавляю больше информации по запросу. У меня на самом деле есть объект, содержащий HTML элементов. Этот объект извлекается с var items = $('.db-gallery-item')
. Значения этого объекта, как я уже сказал, являются <div>
элементами, содержащими контейнер <div>
с двумя элементами внутри для изображений (<img>
и <a>
) и один элемент <video>
для видео. Загружая их, я должен следить за их порядком, поэтому требуется дождаться загрузки каждого элемента, чтобы сделать его видимым, и go работает над следующим.
решено: удалось решить это с помощью решения, предложенного пала sh. Это последний код, который я использовал.
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 рабочий пример.