2009-07-19 10 views
9

Muszę załadować obraz synchronicznie, tj. Muszę wstrzymać wykonywanie javascript do momentu załadowania obrazu. Ponieważ image.onload jest asynchroniczne, główna funkcja powróci przed załadowaniem obrazu.Ładowanie obrazów synchronicznie za pomocą javascript

Używam płótna, a jeśli funkcja główna powróci przed załadowaniem obrazu, a zatem narysowana, inne rzeczy w obszarze roboczym zostaną narysowane przed obrazem. To nie działa, ponieważ kolejność rysowania na płótnie jest bardzo ważna!

Oto co robiłem:

var img = new Image(); 
img.onload = function() { 
    //image drawing code here 
} 
img.src = "blahblahblah"; 
//function returns here, and other drawing code happens before image is drawn 

Czy istnieje sposób, aby to zrobić synchronicznie lub poczekać, aż obraz jest w pełni załadowany przed powrotem z funkcji?

Odpowiedz

2

Czy istnieje sposób, aby to zrobić synchronicznie, czy czekać, aż obraz jest w pełni załadowany przed powrotem z funkcji?

Nie. AFAIK, jedyną rzeczą, którą można wykonać synchronicznie w JavaScript, jest synchroniczne wywołanie XHR.

W każdym razie, powinieneś naprawdę robić to konfigurowanie dziedziczenia zwrotnego, które implementuje twoje zależności.

+0

Mam bardzo dużą pętlę wykonującą wiele rysunków na płótnie i trudno jest wstrzymać pętlę podczas wczytywania obrazu, co jest tym, czego potrzebuję. Jeśli użyłem callback'u image.onload, obraz zostanie narysowany po czymś innym w pętli. To powoduje, że obraz pojawia się przed rzeczami, które powinny być z tyłu. – devongovett

+0

W funkcji, która rozpoczyna ładowanie obrazu, jako ostatnia rzecz, użyj setInterval, aby uruchomić funkcję, która zamyka się nad obiektem, który jest również zamknięty przez twój image.onload callback. Funkcja "interwał" powinna nic nie robić, dopóki nie zostanie ustawiona określona flaga. Ta flaga powinna być ustawiona przez twój image.onload callback. Po znalezieniu flagi, funkcja "interwał" powinna wywołać następny fragment kodu; kod, który rysuje się na górze obrazu "tła". –

+0

Nie możesz * przerwać, musisz uwolnić się od tego pomysłu. –

0

Nie sądzę, że można to zrobić asynchronicznie i uważam, że byłoby bardzo ryzykowne, gdyby ścieżka do pliku obrazu była niewłaściwa. Musisz wziąć pod uwagę, że onload jest wywołaniem zwrotnym, które zostanie wywołane, gdy obraz zostanie w pełni załadowany.

Musisz więc wykonać cały kod rysunku w funkcji wywołania zwrotnego.

2

Czy nie można tego rozwiązać przez refaktoryzację?

Zawiń dowolny kod, który musisz wykonać po wczytaniu obrazu do funkcji wywoływanej przez wywołanie zwrotne (lub wywołaj funkcję callbak).

Widzę, że mówisz, że jeśli funkcja główna powróci, inny kod zostanie wykonany. Czy możesz to także owinąć? Czy możesz opóźnić jego wykonanie lub uzależnić od tego zdarzenia onload lub innego zdarzenia?

Można nawet dynamicznie załadować źródło drugiego kodu javascript w załadowanym obrazie.

Powiązane problemy