413 votos

¿Cómo puedo pasar un parámetro a un setTimeout () de devolución de llamada?

Tengo algo de código JavaScript que se parece a:

 function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    var topicId = xmlhttp.responseText;
    setTimeout("postinsql(topicId)",4000);
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}
 

Me sale un error que topicId Todo no se define estaba trabajando antes de que yo usé el setTimeout() función.

Quiero que mi postinsql(topicId) función a ser llamada después de algún tiempo. Qué tengo que hacer?

617voto

meder Puntos 81864
 setTimeout(function() {
    postinsql(topicId);
}, 4000)
 

Usted necesita para alimentar a una función anónima como parámetro en lugar de una cadena, el último método no debería incluso trabajar por la especificación ECMAScript pero los navegadores son sólo indulgente. Esta es la solución adecuada, no siempre depender de pasar una cadena como una "función" cuando se utiliza setTimeout() o setInterval() , que es más lento debido a que tiene que ser evaluado y que sólo ISN 't derecha.

295voto

Fabio Phms Puntos 1725

En los navegadores modernos, el "setTimeout" recibe un tercer parámetro que se envía como parámetro a la función interna al final del temporizador.

Ejemplo:

 var hello = "Hello World";
setTimeout(alert, 1000, hello);
 

Más detalles:

66voto

Jiri Vetyska Puntos 489

Después de hacer algunas investigaciones y pruebas, la única aplicación correcta es:

 setTimeout(yourFunctionReference, 4000, param1, param2, paramN);
 

setTimeout pasará todos los parámetros adicionales a su función para que puedan ser procesados ​​allí.

La función anónima puede trabajar para cosas muy básicas, pero dentro de instancia de un objeto en el que usted tiene que utilizar "esto", no hay manera de hacer que funcione. Cualquier función anónima cambiará "esto" para que apunte a la ventana, por lo que perderá su referencia de objeto.

37voto

David Meister Puntos 958

Esta es una vieja pregunta con respuesta "correcta", pero pensé que me gustaría mencionar otro enfoque que nadie ha mencionado aquí. Esto es copiado y pegado de la excelente subrayado de la biblioteca:

_.delay = function(func, wait) {
  var args = slice.call(arguments, 2);
  return setTimeout(function(){ return func.apply(null, args); }, wait);
};

Usted puede pasar tantos argumentos como le gustaría a la llamada de la función por setTimeout y como un bono adicional (bueno, normalmente un bono) el valor de los argumentos pasados a la función se congelan cuando llame setTimeout, por lo que si cambian de valor en algún punto entre el momento en que setTimeout() se llama y cuando se agota, bueno... eso no es muy frustrante ya :)

Aquí un violín donde se puede ver a lo que me refiero - http://jsfiddle.net/thedavidmeister/7t2bV/

16voto

dain Puntos 4393

Hobblin ya se ha comentado esto en la pregunta, pero debería ser una respuesta de verdad!

Utilizando Function.prototype.bind() es la más limpia y flexible forma de hacerlo (con la ventaja añadida de ser capaz de establecer el this contexto):

setTimeout(postinsql.bind(null, topicId), 4000);

Para obtener más información, consulte estos MDN enlaces:
https://developer.mozilla.org/en/docs/DOM/window.setTimeout#highlighter_547041 https://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/Function/bind#With_setTimeout

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: