2011-03-06 20 views
5

que he acabo de preguntar acerca de llamar a las funciones por su nombre, ahora quiero procesar return declaración después SetTimeout:Obtener valor de retorno después de SetTimeout

function ECall(funcName, arg) 
{ 
    command += "("; 
    for (var i=1; i<arguments.length; i++) 
    { 
     command += "'" + arguments[i] + "'"; 
     if (i != arguments.length-1) command += ','; 
    } 
    command += ")"; 

    //var funcPtr = eval(funcName); 
    //return funcPtr(arg); // This works, but I need SetTimeout 

    setTimeout('window[\'' + funcName + '\']' + command, 1000); 
} 

setTimeout funciona muy bien, pero tengo que guardar el valor de retorno de llamada función . Cuando escribo: setTimeout('alert(window[\'' + funcName + '\']' + command + ')', 1000); Alerta el valor de retorno de la función. ¿Cómo puedo almacenarlo?

Respuesta

5

No es necesario utilizar alguna de esta manipulación de cadenas. Solo pase una referencia de función al window.setTimeout(). Para almacenar el valor devuelto de la función, sólo tiene que asignarlo a una variable en la función que se pasa a window.setTimeout()

var savedValue; 

function ECall(funcName) 
{ 
    var args = Array.prototype.slice.call(arguments, 1); 
    var func = window[funcName]; 

    window.setTimeout(function() { 
     savedValue = func.apply(this, args); 
    }, 1000); 
} 
2

Si desea devolver un valor desde ECall, no funcionará.

El setTimeout es asíncrona, lo que significa que el ECall volverá antes se invoca el código setTimeout.

O si desea que el alert() forme parte del setTimeout, puede pasar una función anónima. Además, sería mejor no pasar una cadena al setTimeout.

me gustaría hacer esto en su lugar:

function ECall(funcName, arg) 
{ 
     // Get an Array of the arguments, except for the first one. 
    var args = Array.prototype.slice.call(arguments, 1); 

     // Pass an anonymous function that calls the global "funcName" function 
     // inside the alert(). 
     // It uses .apply() to pass the arguments we sliced. 
    setTimeout(function() { 
     alert(window[ funcName ].apply(window, args)); 
    }, 1000); 
} 
+1

Usted escribió que es imposible obtener el valor de retorno después de setTimeout, ¿verdad? ¿Hay alguna forma de hacer eso? – Ockonal

+0

@Ockonal: utilicé una alerta en mi respuesta, pero @Tim Down muestra el mismo concepto [en su respuesta] (http://stackoverflow.com/questions/5211103/get-return-value-after-settimeout/5211190# 5211190), pero almacena el resultado en una variable predefinida (que es lo que parecías querer). El valor no estará disponible hasta que se ejecute 'setTimeout' por supuesto. – user113716

Cuestiones relacionadas