2009-11-21 8 views
5

¿Hay alguna forma de ejecutar una función después de que se completen otras? Por ejemplo:funciones sincrónicas jquery

doSomething(); 
doSomethingElse(); 

quiero solamente doSomethingElse() para ejecutar después de doSomething completa. ¿es posible?

+2

¿No te lo publicado ya hacer lo que quiera? ¿Que me estoy perdiendo aqui? –

+1

+1 para contrarrestar el -1. Esta pregunta es tan válida como cualquier otra. – echo

+1

¿Alguna posibilidad de que nos proporciones más código o decirnos qué estás tratando de hacer? – Nosredna

Respuesta

7

Si su función doSomething() está haciendo algo de forma asíncrona (como hacer una petición Ajax), entonces usted querrá hacer doSomethingElse() la devolución de llamada para esa solicitud asíncrona, en lugar de tener que ejecutar inmediatamente después de doSomething() devoluciones.

+0

Estoy haciendo una solicitud de AJAX así que esta parece ser la solución válida para ponerla en la devolución de llamada, pero estaba tratando de hacerlo fuera de la devolución de llamada. – ngreenwood6

-1

No hay manera de hacer cumplir esta manera explícita per se, pero una idea es tener doSomething() devuelve un valor que doSomethingElse() acepta como parámetro:

retval = doSomething(); 
    doSomethingElse(retval); 

de esa manera por lo menos prevenir que alguien llamando a doSomethingElse() sin al menos proporcionar el argumento que necesita ... por supuesto, si obtienen ese argumento de llamar a doSomething() es otro problema. Pero esto es un comienzo.

Idea eliminada de Code Complete.

+5

No veo cómo eso resuelve nada. La única forma en que la pregunta tiene sentido es si doSomething() está haciendo algo asíncrono. Devolver y pasar valores no tendría ningún efecto sobre cuándo se realiza el trabajo. – Nosredna

6

Actualmente puede hacer lo que quiera con jQuery (al menos en algún sentido). Podría considerarse un poco hacky pero funciona sin defectos.

Solo incluya un elemento en su página que no utilice para nada más. p.ej. un div vacío en alguna parte.

<div id="syncFnHolder"></div> 

Y a continuación, incluyen la JS con sus funciones + la función runMe escrito por mí.

function doSomething() { alert("First"); } 
function doSomethingElse() { alert("Second"); } 
function doSomethingElseThree() { alert("Third"); } 

function runMe(fn, selec) { 
    return function() { 
     fn(); 
     setTimeout(function() { 
      $(selec).dequeue("syncFnQueue"); 
     }, 1000); 
    } 
}; 

var selector = "#syncFnHolder"; 
//add three functions to a queue 
$(selector).queue("syncFnQueue", runMe(doSomething, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector)); 
//start first function in queue (FIFO) others are triggered automatically 
$(selector).dequeue("syncFnQueue"); 

Esto generaría tres alertas con una distancia de 1 seg entre ellos diciendo "primero", "segundo", "tercero".

Si no desea demora, elimine setTimeout y simplemente deje la llamada en $(selec).dequeue("syncFnQueue");.

Si sus funciones necesitan parámetros, p. doSomething(x,y,z) necesita adaptar la función runMe para que sea un mejor parcial y para construir la función devuelta de manera diferente. Marque aquí o publique una nueva pregunta.

javascript partial

+1

muy interesante – gpilotino

+2

¿Por qué no hacer cola y dequeue en un objeto JS? Parece inútil que aparezca en un elemento DOM ficticio. – nickytonline

+0

? ¿Cómo puedo hacer eso con jQuery? Supongo que no puedo entender lo que quieres decir a esta hora del día (02:45 AM). – jitter

2

La pregunta es un poco vago.

Si sus funciones tienen bits asíncronos, utilice las devoluciones de llamada. Para eso son.

Si, sin embargo, desea realizar una programación orientada a aspectos en JavaScript, consulte jQuery-aop.

3

Es posible que desee hacer esto ....

function doSomething(callback) { 
    // code for do some thing 
    // now fire off the callback 
    if (typeof callback === 'function') { 
     callback(); 
    } 
} 

function doSomethingElse() { 
} 

doSomething(doSomethingElse); 
Cuestiones relacionadas