Récupère la valeur de retour de setTimeout

Je veux juste obtenir la valeur de retour de setTimeout mais ce que j'obtiens est un format de texte entier de la fonction?

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

console.log(x());
28
demandé sur Vainglory07 2014-07-24 12:35:07

4 réponses

Vous devez utiliser des promesses pour cela. Ils sont disponible en ES6, mais peut être polyfilled 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, il devient plus agréable si dans une fonction async:

async function() {
  const result = await x();
  console.log(result); // --> 'done!';
}
39
répondu Matt Clarkson 2018-05-11 09:39:31

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

La fonction qui a appelé setTimeout (x dans votre exemple) terminera l'exécution et retournera avant même que la fonction que vous passez à setTimeout soit appelée.

Tout ce que vous voulez faire avec la valeur que vous obtenez, vous devez le faire à partir de la fonction que vous passez à setTimeout.

Dans votre exemple, cela serait écrit comme:

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

x();
9
répondu Quentin 2014-07-24 08:38:14

Mieux vaut prendre un rappel pour la fonction x et quelle que soit la tâche que vous voulez effectuer après ce délai d'attente, envoyez 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
répondu Mritunjay 2014-07-24 08:47:02

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

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

Vous pouvez accéder à la variable y après le délai d'attente pour savoir fait ou non

0
répondu tuan huynh 2014-07-24 08:52:03