2009-07-19 4 views
9

Ho bisogno di caricare un'immagine in modo sincrono, ovvero ho bisogno di sospendere l'esecuzione di javascript fino a quando l'immagine non viene caricata. Poiché image.onload è asincrono, la funzione principale tornerà prima che l'immagine venga caricata.Caricamento immagini in modo sincrono con javascript

Sto usando canvas, e se la funzione principale ritorna prima che l'immagine sia caricata, e quindi disegnata, altre cose nella tela verranno disegnate prima dell'immagine. Questo non funziona perché l'ordine di disegnare su una tela è molto importante!

Ecco quello che ho fatto:

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 

C'è un modo per fare questo in modo sincrono, o aspettare fino a quando l'immagine è stata caricata completamente prima di tornare dalla funzione?

risposta

2

C'è un modo per fare questo modo sincrono, o aspettare fino a quando l'immagine del è completamente caricato prima di tornare dalla funzione?

No. AFAIK, l'unica cosa che può essere eseguita in modo sincrono in Javascript è una chiamata XHR sincrona.

In ogni caso, ciò che dovresti fare è impostare un'eradarchia di callback che implementa le tue dipendenze.

+0

Ho un ciclo molto grande che fa molto disegno sulla tela, ed è difficile fare il ciclo di pausa mentre l'immagine si sta caricando, che è quello che mi serve. Se ho usato il callback image.onload, l'immagine sarebbe stata disegnata dopo qualcos'altro nel ciclo. Ciò fa apparire l'immagine davanti alle cose che dovrebbe essere dietro. – devongovett

+0

Nella funzione che avvia il caricamento dell'immagine, come ultima cosa, usa setInterval per avviare una funzione che si chiude su un oggetto che è anche chiuso dal tuo image.onloadback. La funzione "intervallo" non dovrebbe fare nulla fino a quando non è stato impostato un flag specifico. Quella bandiera dovrebbe essere impostata dal tuo image.onloadbackback. Quando trova il flag impostato, la funzione "interval" dovrebbe chiamare il prossimo pezzo di codice; il codice che disegna sopra l'immagine di "sfondo". –

+0

Non * puoi * farla mettere in pausa, devi liberare questa idea dalla tua mente. –

0

Non penso che sia possibile farlo in modo asincrono e pensare che sarebbe molto rischioso se il percorso del file di immagine è sbagliato. È necessario considerare che onload è un callback, che verrà chiamato quando l'immagine è completamente caricata.

Quindi è necessario eseguire il codice di tutti i disegni nella funzione di richiamata.

2

Non è possibile risolvere questo problema con il refactoring?

Consente di avvolgere qualsiasi codice che è necessario eseguire dopo il caricamento dell'immagine in una funzione richiamata dal callback (o rendere tale funzione il callbak).

Vedo che si dice che se la funzione principale viene restituita, verrà eseguito un altro codice. Puoi avvolgerlo anche tu? Puoi ritardare la sua esecuzione o renderla dipendente da questo evento onload o da qualche altro evento?

Si potrebbe anche caricare dinamicamente la fonte dell'altro codice javascript nell'immagine onload.