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());
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!';
}
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();
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)
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