2010-09-02 27 views
7

he el siguiente código:Javascript esperar la respuesta de la función

myFunc(); 
bar(); 

myFunc() está haciendo una petición AJAX

no quiero para ejecutar la barra() hasta myFunc() 's petición ha completado.

Tampoco quiero mover la llamada a la barra() dentro de myFunc.

posible?

EDITAR

Este es el código que terminó con:

var FOO = { 
init: function(blah) 
{ 
    // Callbacks to pass to the AJAX challenge data load 
    var callbacks = { 
    myFunc1: function(){ myFunc1(blah); }, 
    myFunc2: function(){ myFunc2(blah); }, 
    }; 

    this.bar(callbacks); // Load the challenge data and setup the game 
}, 
bar: function(callbacks) { ..loop through and execute them.. } 

}; 
+1

Jan y Jerome ambos tienen respuestas válidas, personalmente me estoy inclinando hacia Jeromes ya que esa es la manera típica de hacer cosas en JavaScript –

+0

¿Por qué estás reinventando la rueda? No hay ninguna razón justificable para tratar con todas las peculiaridades de los navegadores cruzados en lugar de utilizar una biblioteca Ajax prefabricada que admita retrollamadas. – slikts

+0

No estaba tratando de reinventar la rueda. Simplemente no sabía lo que estaba haciendo, punto. La sugerencia de Jerome funcionó muy bien. Ver el * EDIT * por lo que terminé con: Creo que es ideal ... –

Respuesta

6

Con el fin de hacer lo que está buscando, usted debe encontrar una manera para que bar() para comunicarse con myFunc().

Cuando usted dice que usted no desea mover la llamada a bar() dentro myFunc() esto se puede interpretar de varias maneras.

Por ejemplo, usted podría hacer bar() un parámetro de myFunc()

function bar() { 
    // do what bar() does 
} 

function myFunc(callback) { 
    // use callback in the onreadystatechange property of the xmlhtprequest object 
} 

myFunc(bar) 

espero que esto le ayudará a

Jerome Wagner

0

No, no es posible a menos que utilice una petición síncrona que ya no es AJAX y algo que yo no le recomendaría ya que congelará la interfaz de usuario hasta que la solicitud se complete y los usuarios odien tener congelado su navegador.

0

No, no es posible.

Puede lograrlo con el efecto secundario de bloquear el navegador haciendo una solicitud SJAX en lugar de una solicitud AJAX, pero esa es una idea terrible.

Aprenda a adorar la programación impulsada por eventos cuando trabaje en un entorno de programación orientado a eventos.

1

SI puede agregar un tipo de bandera que indique que myFunc() ha terminado con su solicitud, puede hacerlo, pero esta no es una buena idea: la mejor práctica es usar devoluciones de llamada.

probar este código:

var successRequest = false; 
myFunc(); // when get the response set successRequest to true 

var interval = setInterval(function() { 
    if (successRequest) { 
     clearInterval(interval); 
     bar(); 
    } 
}, 100); 
+0

¿Funciona setInterval como global? Me refiero a si configuro el intervalo en alguna función y si la restablezco en otro (o en la misma función con un nuevo rewuest) ¿entiende esto otros setIntervals o no? – kamaci

Cuestiones relacionadas