web-dev-qa-db-fra.com

Obtenir la valeur de retour de setTimeout

Je veux juste obtenir la valeur de retour de setTimeout, mais ce que je reçois est un format de texte entier de la fonction?

function x () {
    setTimeout(y = function () {
        return 'done';
    }, 1000);
    return y;
}

console.log(x());
40
Vainglory07

Vous devez utiliser les promesses pour cela. Ils sont disponible dans ES6 mais peuvent être remplis de manière assez facilement :

function x() {
   var promise = new Promise(function(resolve, reject) {
     window.setTimeout(function() {
       resolve('done!');
     });
   });
   return promise;
}

x().then(function(done) {
  console.log(done); // --> 'done!'
});

Avec async/await dans ES2017, cela devient plus agréable si, à l'intérieur d'une fonction async:

async function() {
  const result = await x();
  console.log(result); // --> 'done!';
}
59
Matt Clarkson

Vous ne pouvez pas obtenir une valeur de retour de la fonction que vous passez à setTimeout.

La fonction appelée setTimeout (x dans votre exemple) finira de s'exécuter et sera renvoyée avant que la fonction passée à setTimeout ne soit même appelée.

Quoi que vous souhaitiez faire avec la valeur que vous obtenez, vous devez le faire depuis la fonction que vous passez à setTimeout.

Dans votre exemple, cela s’écrirait ainsi:

function x () {
    setTimeout(function () {
        console.log("done");
    }, 1000);
}

x();
13
Quentin

Mieux vaut prendre un rappel pour la fonction x et quelle que soit la tâche que vous souhaitez effectuer après ce délai, envoyez-le dans ce rappel.

function x (callback) {
    setTimeout(function () {
        callback("done");
    }, 1000);
}

x(console.log.bind(console)); //this is special case of console.log
x(alert) 
1
Mritunjay

Vous pouvez utiliser une combinaison de Promise et de setTimeOut comme dans l'exemple ci-dessous

let f1 = function(){
    return new Promise(async function(res,err){
        let x=0;
        let p = new Promise(function(res,err){
            setTimeout(function(){
                x= 1;
                res(x);
            },2000)
        })
        p.then(function(x){
            console.log(x);
            res(x);
        })


    });
}
0
Satyabrata Saha

Je pense que vous voulez que le drapeau sache qu'un événement s'est produit ou non. setTimeout ne retourne pas de valeur. vous pouvez utiliser une variable pour détecter l'événement survenu ou non

var y="notdone";
   setTimeout(function () {
         y="done";
    }, 1000);

Vous pouvez accéder à la variable y après l'expiration du délai imparti pour savoir si c'est fait ou non

0
tuan huynh