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