retarder le retour d'une fonction
est-il de toute façon à retarder le retour d'une fonction à l'aide de setTimeout()
.
function foo(){
window.setTimeout(function(){
//do something
}, 500);
//return "some thing but wait till SetTimeout() finished";
}
Le setTimeout appel ne démarre pas jusqu'à ce que la fonction en cours est terminé, donc, si la fonction actuelle est en attente pour setTimeout pour revenir il aura une très longue attente... 🙁
OriginalL'auteur khousuylong | 2011-06-14
Vous devez vous connecter pour publier un commentaire.
Vous ne voulez pas de "retarder" le code, car il permettrait de verrouiller le navigateur thread de l'ensemble de votre navigateur inutilisable jusqu'à ce que le votre script délai d'expiration est passée.
Vous pouvez soit créer un évènement qui est à l'écoute d'un signal déclenché après un certain temps a passé. jQuery
.bind()
et.trigger()
est ce que vous voulez http://api.jquery.com/trigger/Ou, vous pouvez utiliser une fonction de rappel pour travailler avec les données que vous voulez a l'issue du temps ellapsed. Donc, si ce que vous avez voulu être comme ceci:
Devrait être quelque chose comme ceci:
setTimeout
ne pas "bloquer" l'exécution de codeOriginalL'auteur Jj.
.setTimeout()
est pour l'exécution d'une fonction complète après un délai d'attente. Il est pas pour retarder le code.https://developer.mozilla.org/En/Window.setTimeout
Un bon lien serait: Qu'est-ce que la version JavaScript de sleep()?
(Une bonne question à poser est pourquoi vous avez besoin de votre fonction de sommeil?)
OriginalL'auteur James Khoury
Il suffit d'appeler la chose que vous voulez arriver après le délai d'expiration à la fin de la temporisation de la fonction comme ci-dessous:
Plutôt que de retourner. Mettre le code qui s'appuie sur la valeur de retour dans
delayedCode()
et le passer en paramètre à la fonction.OriginalL'auteur Endophage
À l'aide de promesses:
Réponse mis à jour grâce à @NikKyriakides, qui a souligné async/await n'est pas nécessaire. J'ai d'abord eu
async () => resolve(await apiCall())
.async/await
. Juste:setTimeout(() => resolve(apiCall()), 3000);
Vous avez raison @NikKyriakides! Je vous remercie. Sera mise à jour de ma réponse.
nouvelle Promesse(résoudre => { setTimeout(() => résoudre(apiCall()), 3000); }); Corrigé la faute de frappe avec la parenthèse manquante.
OriginalL'auteur Nelu