Szukałem wielu odpowiedzi na JavaScript, ale nie znalazłem takiego, który naprawdę odpowie na mój problem. Próbuję załadować obraz, pobrać dane piksela, przeprowadzić analizę, a następnie załadować kolejny obraz, aby powtórzyć proces.JavaScript czeka, aż obraz zostanie w pełni załadowany przed kontynuowaniem skryptu
Mój problem polega na tym, że nie mogę wstępnie wczytać wszystkich obrazów, ponieważ ten skrypt musi być w stanie pracować na dużych ilościach obrazów, a wstępne ładowanie może być zbyt dużym zasobem. Tak więc utknąłem próbując załadować nowy obraz za każdym razem, gdy przechodzę przez pętlę, ale utknąłem z powodu wyścigu pomiędzy ładowaniem obrazu a scenariuszem rysującym go w kontekście płótna. Przynajmniej jestem całkiem pewien, że tak właśnie się dzieje, ponieważ skrypt będzie działał dobrze z wyeksponowanymi obrazami (na przykład, jeśli odświeżam po wczytaniu strony wcześniej).
Jak widzisz, kilka linii kodu zostało zakomentowanych, ponieważ jestem niesamowicie nowy w JavaScript i nie działały tak, jak myślałem, ale nie chciałem o nich zapomnieć, jeśli potrzebował później funkcjonalności.
Jest to fragment kodu, który moim zdaniem jest powodującego problemu:
EDIT: Więc mam moją funkcję do pracy po wykonaniu sugestii
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;
}
To pytanie nadal pobiera widoki 4 lata później, więc pomyślałem, że wspomnę, że jeśli masz dużo obrazów, możesz chcieć wywołać rekursywne 'loadImages' z' setTimeout (..., 0) 'aby stos wywołań nie przepełnia się. – Braains