Cómo obtener una variable devuelta a través de múltiples funciones – Javascript / jQuery

Esta pregunta en resumen es averiguar cómo pasar variables entre funciones de javascript sin: devolver variables, pasar parámetros entre funciones primarias, usar variables globales y forzar la función 1 a esperar a que la función 2 termine. Descubrí una solución jQuery y la publiqué a continuación (en la sección de respuestas).


Old Post: Inicializo un conjunto de cuatro funciones, cada una de las cuales se llama una a otra de una manera diferente. Al final, necesito que el producto modificado final (una matriz) se devuelva a la función de inicialización.

Las variables globales no obligan a la función inicial a esperar. Y devolverlo al revés cuatro veces tampoco funciona. ¿Cómo devuelve una variable modificada a su función de inicialización, si no puede devolverla? ¿O por qué no está volviendo?

(el laberinto comienza en initFunctionA , termina en functionD )

 classOne = { initFunctionA : function() { classTwo.functionB(functionD, array); // I NEED ACCESS TO ARRAY2 HERE }, functionD : function(data, array) { var array2 = // modifications to array } } {...} classTwo = { functionB : function(callback, array) { $.ajax({ success: function(ret){ classTwo.functionC(ret, callback, array) } }); }, functionC : function(ret, callback, array) { callback(ret.data.x, array); } } 

Cambie su callback (en el sitio de la llamada) de modo que capture el valor de retorno de functionD . Luego, cambie functionD para que devuelva array2 . He agregado this acceso al ejemplo a continuación como una conveniencia. (Además, asegúrese de incluir puntos y coma donde sea necesario si desea que JSLint esté contento).

 classOne = { initFunctionA : function() { var self = this; classTwo.functionB(function() { var array2 = functionD.apply(self, arguments); // ACCESS ARRAY2 HERE }, array); }, functionD : function(data, array) { var array2 = // modifications to array return array2; } }; {...} classTwo = { functionB : function(callback, array) { $.ajax({ success: function(ret){ classTwo.functionC(ret, callback, array) } }); }, functionC : function(ret, callback, array) { callback(ret.data.x, array); } }; 

No puedes hacer que funcione con un patrón como el que has escrito allí; Simplemente no es posible en Javascript porque no existe tal cosa como “esperar”. Su código ajax tiene que tomar un parámetro de callback (que usted tiene, aunque no está claro de dónde viene o qué hace), y esa función inicial debe pasar el código para hacer lo que necesita con la matriz después de la llamada ajax acabados

Yo usaría un constructor de objetos:

 function ClassOne() { this.array2 = []; } ClassOne.prototype.initFunctionA = function() { // ... } ClassOne.prototype.functionD = function(data, array) { // Can use array2 EX: this.array2 } var classOne = new ClassOne(); 

Así es como entiendo su problema: classTwo maneja una llamada AJAX y puede modificar el resultado. classOne utiliza classTwo para obtener algunos datos y necesita los datos resultantes.

Si es así, ¿cómo es esto?

 classOne = { initFunctionA : function() { var array = ['a','b','c']; classTwo.functionB(this.functionD, array); }, functionD : function(data, array) { // This function is called when the AJAX returns. var array2 = // modifications to array } } {...} classTwo = { functionB : function(callback, array) { $.ajax({ success: function(ret){ classTwo.functionC(ret, callback, array) } }); }, functionC : function(ret, callback, array) { callback(ret.data.x, array); } } 

Entonces classOne.initFunctionA llama a classTwo.functionB que configura una llamada ajax. Cuando la llamada ajax se completa con éxito, se llama a classTwo.functionC con el resultado y la matriz inicial. Desde aquí, se llama a classOne.functionD con ret.data.x y la matriz.

¡Bueno! Encontré una forma de pasar variables entre funciones sin:

  • haciendo variables globales
  • Creación de propiedades de objetos (solución del caos).
  • pasando parámetros

Estos tres fueron sugeridos aquí como las únicas formas.

Acceso a variables desde otras funciones sin usar variables globales

Pero, si no puede pasar parámetros directamente y necesita una función para esperar a la otra (es decir, no puede confiar en las referencias), y está utilizando llamadas asíncronas al servidor en una función intermedia, entonces su La única solución es:

Usando jQuery …

Cree este objeto en el DOM (dinámicamente si no desea enturbiar su marca):

 

Y en la función que hay que esperar:

 //Function & Class Set 1 // action set 1 $('#domJSHandler').triggerHandler('proceedWithAction', [param1, param2]); 

Esencialmente encierre las últimas acciones que necesita realizar en un evento personalizado de jQuery bind en un objeto DOM invisible. Desencadena ese evento desde JS con el activador de jQuery. Pasa tus parámetros y listo!

Estoy seguro de que SO me dará una mierda por esto (y por aceptar narcisísticamente mi propia respuesta) pero creo que es bastante shiny para un súper novato y funcionó para mí.

Así que: p Stack Overflow (jk Todos me habéis salvado el culo muchas veces y os quiero a todos 🙂