Domanda

In sostanza voglio essere in grado di avvolgere qualsiasi comando in un metodo $ .holdTillFinished () che non permetterà l'esecuzione di continuare fino a quando l'animazione metodo / jquery specificato è terminato l'esecuzione.

Ho il sospetto che questo può essere difficile o addirittura impossibile in javascript, ma sto sperando che qualcuno lo saprà.

Non voglio sentir parlare di come posso passare un callback in un'animazione per fare eseguire onComplete, o qualsiasi altra cosa del genere.

voglio davvero sapere se una cosa del genere è possibile e come andare su di esso.

Se questo non accadrà se qualcuno sa di un bel plugin coda che è in grado di fare la coda entrambi i metodi e le animazioni definiti dall'utente, che sarebbe troppo freddo. Quello che voglio davvero è un modo per ritardare l'esecuzione però. (Mentre le animazioni ancora permette di funzionare)

È stato utile?

Soluzione

  

Ho il sospetto che questo può essere difficile o addirittura impossibile in JavaScript

Il sospetto è corretto. Metodi come le animazioni, l'input dell'utente loop e 'async = true' XMLHttpRequests deve di controllo restituito al browser al fine di procedere, e il browser non può riprendere il controllo fino a che ogni livello di nidificazione della chiamata di funzione è tornato . Ciò significa che tutto il codice, compresa la funzione che ha chiamato ‘holdTillFinished ()’ avrebbe dovuto rilassarsi:. Percio ‘holdTillFinished ()’ è impossibile

Altre lingue hanno caratteristiche di flusso di controllo che permettono di eseguire efficacemente un processo asincrono come quello che appare al chiamante per essere sincrono, e similmente viceversa. Il più conosciuti sono discussioni e continuazioni . JavaScript non possiede queste strutture, quindi la cosa migliore che puoi fare è timeout e callback.

(Definizione di un callback come una funzione inline per ottenere l'accesso alle variabili della funzione di inclusione in una chiusura non almeno prendere un po 'di dolore fuori di esso; alcune altre lingue devono iniziare avvolgendo ogni bit di stato che lo racchiude in proprietà di un oggetto per raggiungere questo obiettivo.)

Altri suggerimenti

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);
  });
};

Si potrebbe utilizzare un'architettura publish / subscribe per ottenere quello che vuoi. Senza sapere molto su che cosa esattamente si vuole raggiungere, la mia ipotesi è che questo lavoro per voi.

Il modo in cui funziona è che si guarda al completamento della funzione come un evento, che è possibile ascoltare e allegare i gestori a. Dojo ha un meccanismo PubSub , anche se sono sicuro che ci sono altri.

Si difende sulla situazione, ma normalmente è necessario mostrare un'immagine elaborazione da mostrare quando viene chiamato AJAX o qualsiasi ciclo viene eseguito in javascript. Ho una situazione in cui sto chiamando AJAX in un ciclo, per l'utente di visualizzare l'immagine di elaborazione viene visualizzata. Per terminare ho fatto un trucco. Ho messo un pulsante per annullare il lavoro quando questa funzione viene chiamata a impostare una variabile globale dire 'cancelJob' true e nel ciclo in cui sto controllando questo mondiale se questo è vero la corsa di ritorno falso e lo script si fermerà.

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

function cancelButtonPress(){
   cancelJob = true;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top