web-dev-qa-db-fra.com

Passer le paramètre à la fonction de rappel setTimeout

J'ai du code JS comme ci-dessous;

var x = self.someAJAXResponseJSON; // x has some object value here
setTimeout(function(x){
    console.log("setTimeout ... : " + x); // But x is undefined here
}, 1000);

Je veux donc passer "x" à la fonction de rappel setTimeout. Mais je reçois "x" comme indéfini dans le setTimeout.

Qu'est-ce que je fais mal ?

ACTUALISÉ

Toute idée de correction pour un problème similaire à l'aide de DOJO JS

setTimeout(dojo.hitch(this, function(){
    this.executeSomeFunction(x); // what shud be this
    console.log("setTimeout ... : " + x); // But x is undefined here
}), 1000);
13
testndtv

Vous pouvez également le faire sans créer de fermeture.

function myFunction(str1, str2) {
  alert(str1); //hello
  alert(str2); //world
}

window.setTimeout(myFunction, 10, 'hello', 'world');

Mais notez que cela ne fonctionne pas sur IE < 10selon MDN .

11
Maciej Krawczyk

Lorsque setTimeout appelle le rappel, il ne passe aucun argument (par défaut); c'est-à-dire que l'argument x n'est pas défini lorsque le rappel est invoqué.

Si vous supprimez le paramètre x, x dans le corps de la fonction ne fera pas référence au paramètre non défini mais à la variable que vous avez définie en dehors de l'appel à setTimeout().

var x = "hello";
setTimeout(function () { //note: no 'x' parameter
    console.log("setTimeout ... : " + x);
}, 1000);

Alternativement, si ce doit être un paramètre, vous pouvez le passer comme argument à setTimeout (faites-vous une faveur et nommez-le différemment, cependant):

var x = "hello";
setTimeout(function (y) {
    console.log("setTimeout ... : " + y);
}, 1000, x);
7
Purag

Ran dedans moi-même et regardé les Node docs, les arguments à passer dans la fonction entrent en tant que 3ème (ou plus) paramètre à l'appel setTimeout donc ...

myfunc = function(x){console.log(x)};
x = "test";
setTimeout(myfunc,100,x);

A travaillé pour moi.

Dans votre code, console.log(x) fait référence au paramètre x de la fonction de rappel.

Omettez-le simplement de la signature de la fonction et tout ira bien:

setTimeout(function(){
  console.log("setTimeout ... : " + x); // now x is the global x
}, 1000);
2
moonwave99

C'est parce que la fonction est appelée sans lui passer d'argument: donc x n'est pas défini.

Vous devriez l'envelopper dans une fermeture si vous êtes prêt à l'appeler avec différents paramètres pour x:

var x = self.someAJAXResponseJSON; // x has some object value here
setTimeout((function(y){
    return(function() {
        console.log("setTimeout ... : " + y);
    })
})(x), 1000);
1
pietro909

la méthode setTimeout est conçue pour prendre la fonction ou l'extrait de code comme premier argument, mais dans votre cas, vous avez pris une fonction anonyme avec le paramètre x et qui est appelée sans prendre d'argument, donc elle est indéfinie car aucune fonction concrète définie ne prend x . Ce que vous pouvez faire, c'est que vous pouvez d'abord définir la fonction que vous souhaitez appeler, puis l'appeler simplement dans la méthode setTimeout. Voir l'extrait de code suivant:

var x = self.someAJAXResponseJSON;
function mylog(x){
  console.log("setTimeout ... : " + x);
}
setTimeOut(mylog(x),1000);
0
Rahul Singh