2009-03-25 13 views
9

Fondamentalmente voglio essere in grado di racchiudere qualsiasi comando in un metodo $ .holdTillFinished() che non consentirà l'esecuzione fino a quando il metodo specificato/l'animazione jquery non sarà completata.È possibile interrompere l'esecuzione in javascript/jquery?

Sospetto che questo possa essere difficile o addirittura impossibile in javascript, ma spero che qualcuno lo sappia.

Non voglio sapere come posso passare una richiamata in un'animazione per farla funzionare incompleta, o qualsiasi altra cosa del genere.

Voglio davvero sapere se una cosa del genere è possibile e come procedere.

Se ciò non accadrà se qualcuno conosce un buon plug-in di coda che è in grado di mettere in coda sia i metodi definiti dall'utente sia le animazioni, sarebbe anche bello. Quello che voglio davvero è un modo per ritardare l'esecuzione però. (Pur consentendo le animazioni di funzionare)

+0

@thirsty: si desidera fare la fila e disconnettere, penso (già suggerito e licenziato da voi di seguito). È possibile mettere in coda metodi arbitrari con animazioni e verranno eseguiti in ordine. Se questo non è ciò che stai chiedendo, potresti chiarire la tua domanda con un esempio di ciò che stai cercando di fare? – Prestaul

+0

Non ho visto una coda che funzioni per le funzioni. Quello che voglio dire è che se passo un'animazione, quindi una funzione, quindi un'animazione nella coda, allora mentre quelle animazioni stanno giocando la funzione non dovrebbe essere in esecuzione. Inoltre non voglio dover specificare quanto tempo impiegherà la funzione per eseguire. – thirsty93

+0

Ma in realtà quello che voglio è un wrapper che interrompe tutto il javascript fino a quando la funzione/animazione che ho passato non è stata risolta. – thirsty93

risposta

10

ho il sospetto che questo può essere difficile o addirittura impossibile in javascript

Il tuo sospetto è corretto. Metodi come animazioni, loop di input dell'utente e 'async = true' XMLHttpRequests devono restituire il controllo al browser per continuare e il browser non può riprendere il controllo fino a quando non viene restituito ogni livello di nidificazione della chiamata di funzione. Ciò significa che tutto il tuo codice, inclusa la funzione chiamata "holdTillFinished()", dovrebbe essere rimosso: pertanto "holdTillFinished()" è impossibile.

In altri linguaggi sono disponibili funzionalità di controllo del flusso che consentono di eseguire in modo efficace un processo asincrono come quello che appare al chiamante per essere sincrono e viceversa. I più noti sono threads e continuations. JavaScript non possiede queste strutture, quindi il meglio che puoi fare è timeout e callback.

(La definizione di un callback come funzione inline per ottenere l'accesso alle variabili della funzione che racchiude in una chiusura fa almeno una parte del dolore, alcuni altri devono iniziare a racchiudere ogni stato di inclusione in un oggetto proprietà per ottenere questo.)

+0

Cosa dicono queste altre lingue? Curioso ... –

+0

Beh, praticamente tutti i linguaggi moderni (senza browser) ti forniscono i thread, usando il supporto del sistema operativo. Continuazioni/coroutine possono essere trovate in almeno Haskell, ML e Scheme e alcune estensioni ad altri linguaggi (es. Stackless Python); ci sono i primitivi in ​​C che possono essere usati per costruire continuazioni. – bobince

+0

Ovviamente, nel mondo dei browser, sei bloccato: oltre a JavaScript c'è solo VBScript, e questo è ancora peggio! JavaScript 1.7 (in Firefox 2) offre generatori in stile Python, che sono una forma limitata di continuazione che non ti aiuterà veramente qui. – bobince

3

Probabilmente siete alla ricerca di http://docs.jquery.com/Effects/queue

Ma se siete alla ricerca di un modo più generalizzato di ritardare le cose, ho usato questo frammento prima (non ho scritto, così tutto il merito va all'autore originale):

//Simple wrapper enabling setTimout within chained functions. 
$.fn.wait = function(time, type) { 
    time = time || 1000; 
    type = type || "fx"; 
    return this.queue(type, function() { 
    var self = this; 
    setTimeout(function() { 
     $(self).dequeue(); 
    }, time); 
    }); 
}; 
+0

Questo non ritarderà l'esecuzione fino al termine della funzione. Ciò che fa è ritardare l'esecuzione in coda entro un certo limite di tempo che sto impostando. Non so quanto tempo ci vuole per eseguire una determinata funzione e non dovrei indovinare. – thirsty93

+0

Questo è meglio di niente però. Ma in realtà non è quello che sto cercando. – thirsty93

0

È possibile utilizzare un'architettura di pubblicazione/sottoscrizione per ottenere ciò che si desidera. Senza sapere molto su cosa esattamente vuoi ottenere, la mia ipotesi è che questo funzioni per te.

Il modo in cui funziona è che si considera il completamento della funzione come un evento, a cui è possibile ascoltare e collegare i gestori. Dojo has a pubsub mechanism, anche se sono sicuro che ce ne sono altri.

+0

Questo è esattamente ciò che non voglio. Un callback che passo alla funzione/animazione in questione – thirsty93

0

Difende la situazione ma normalmente è necessario mostrare un'immagine di elaborazione da visualizzare quando viene chiamato AJAX o qualsiasi ciclo viene eseguito in javascript. Ho una situazione in cui sto chiamando AJAX in un ciclo, perché l'utente mostri l'immagine di elaborazione mostrata. Per terminare ho fatto un trucco. Ho messo un pulsante per cancellare il lavoro quando viene chiamata questa funzione. Imposta una variabile globale che dice 'cancelJob' su true e nel ciclo in cui sto verificando questo globale se questo è vero, l'esecuzione restituisce false e lo script si fermerà.

var cancelJob = false; 
foreach(){ 
    if(cancelJob == true) 
     return false; 
} 

function cancelButtonPress(){ 
    cancelJob = true; 
} 
Problemi correlati