Maison > Article > interface Web > Comment transformer une fonction « setTimeout » en promesse ?
La tâche de créer une promesse pour une fonction qui ne renvoie rien, comme setTimeout, peut être difficile au début. Pour comprendre ce concept, référons-nous à un exemple de code modifié :
<br>fonction async(callback){</p> <pre class="brush:php;toolbar:false">setTimeout(function(){ callback(); }, 5000);
}
async(function(){
console.log('async called back');
});
Notre objectif est de générer une promesse que async pourra renvoyer une fois le rappel setTimeout terminé. prêt.
En utilisant des promesses natives, nous pouvons créer une fonction appelée plus tard comme suit :
<br>fonctionne plus tard (délai) {</p> <pre class="brush:php;toolbar:false">return new Promise(function(resolve) { setTimeout(resolve, delay); });
}
Cette fonction prend un délai en millisecondes et renvoie une promesse qui se résout après l'expiration du délai.
< ;h3>Délai de base avec valeur
Pour le modifier plus tard et l'autoriser pour transmettre une valeur de résolution, nous devons nous assurer que le rappel setTimeout reçoit la valeur en tant qu'argument. Pour les navigateurs prenant en charge la fourniture d'arguments supplémentaires à setTimeout, le code suivant peut être utilisé :
<br>function later(delay, value) {</p> <pre class="brush:php;toolbar:false">return new Promise(function(resolve) { setTimeout(resolve, delay, value); });
}
Ce code garantit que la valeur est transmise au rappel et ensuite résolue par le promesse.
Pour les cas où nous souhaitons offrir la possibilité d'annuler le délai d'attente, nous pouvons créer un objet avec une méthode d'annulation et un accesseur à la promesse. Lorsque la méthode Cancel est appelée, elle efface le délai d'attente et rejette la promesse :
<br>const later = (delay, value) => {</p> <pre class="brush:php;toolbar:false">let timer = 0; let reject = null; const promise = new Promise((resolve, _reject) => { reject = _reject; timer = setTimeout(resolve, delay, value); }); return { get promise() { return promise; }, cancel() { if (timer) { clearTimeout(timer); timer = 0; reject(); reject = null; } } };
};
Cette approche permet d'annuler un délai d'attente en attente et de rejeter la promesse associée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!