Я искал много ответов на JavaScript, но я не нашел того, который действительно отвечает на мою проблему. То, что я пытаюсь сделать, это загрузить изображение, захватить пиксельные данные, выполнить анализ, а затем загрузить другое изображение, чтобы повторить процесс.
Моя проблема в том, что я не могу предварительно загружать все изображения, потому что этот script должен работать на большом количестве изображений, а предварительная загрузка может быть слишком ресурсоемкой. Таким образом, я застрял, пытаясь загружать новое изображение каждый раз через цикл, но я застрял с условием гонки между загрузкой изображения и script, рисуя его в контексте холста. По крайней мере, я уверен, что это происходит, потому что script отлично работает с изображениями, снятыми (например, если я обновляю после загрузки страницы ранее).
Как вы увидите, несколько строк кода закомментированы, потому что я невероятно новичок в JavaScript, и они не работали так, как я думал, они будут, но я не хотел забывать о них, если бы мне функциональность позже.
Это фрагмент кода, который, по моему мнению, вызывает проблему:
EDIT: Итак, я получил свою функцию для работы после выполнения предложения
function myFunction(imageURLarray) {
var canvas = document.getElementById('imagecanvas');
console.log("Canvas Grabbed");
if (!canvas || !canvas.getContext) {
return;
}
var context = canvas.getContext('2d');
if (!context || !context.putImageData) {
return;
}
window.loadedImageCount = 0;
loadImages(context, canvas.width, canvas.height, imageURLarray, 0);
}
function loadImages(context, width, height, imageURLarray, currentIndex) {
if (imageURLarray.length == 0 || imageURLarray.length == currentIndex) {
return false;
}
if (typeof currentIndex == 'undefined') {
currentIndex = 0;
}
var currentimage = new Image();
currentimage.src = imageURLarray[currentIndex];
var tempindex = currentIndex;
currentimage.onload = function(e) {
// Function code here
window.loadedImageCount++;
if (loadedImageCount == imageURLarray.length) {
// Function that happens after all images are loaded here
}
}
currentIndex++;
loadImages(context, width, height, imageURLarray, currentIndex);
return;
}