1
votes

Fonction de rappel après setTimeout

Je n'obtiens pas les résultats escomptés avec ce rappel ci-dessous. J'essaie d'écrire un simple rappel qui s'exécute une fois setTimeout terminé, mais je vois d'abord l'exécution de la fonction de rappel suivie de la fonction réelle.

Qu'est-ce qui me manque ici? pour obtenir les résultats comme ci-dessous.

function doHomeWork(subject, callback){
setTimeout(function(){console.log("doing my homework:", subject)},500)
callback();
}

doHomeWork("Maths", function(){console.log("finished my homework");});

Voici le code que j'essaie d'exécuter.

doing my homework Maths
finished my homework


2 commentaires

Vous devez passer l'appel callback () dans le délai d'expiration! Mettez-le après l'appel console.log . Actuellement, vous démarrez le minuteur avec setTimeout () , puis vous appelez immédiatement le callback () .


^^ l'utilisation d'une indentation et de sauts de ligne appropriés facilite la détection de l'erreur: pastebin.com/WWQHSPN9 (vote pour fermer comme faute de frappe / non-repro / pas-utile-aux-autres-à-l'avenir)


3 Réponses :


1
votes

Lorsque vous appelez setTimeout () , un rappel du navigateur est enregistré. Cela ne signifie pas que les instructions suivantes seront également exécutées plus tard. Ils s'exécuteront immédiatement après avoir appelé la fonction setTimeout () . Seul le paramètre de fonction que vous avez passé sera appelé par setTimeout () lorsque le délai expirera. Donc, si le rappel doit être exécuté après la fonction paramétrée setTimeout () . Il est préférable de déplacer cet appel dans le paramètre de fonction setTimeout () . Ainsi, le code ressemblera à

setTimeout(function() {
    //Your stuff
    callback();
}, 500);


3 commentaires

Vous pouvez probablement supposer que la fonction console.log () dans sa fonction timeout est censée précéder votre appel setTimeout ().


"Lorsque vous appelez setTimeout (), un thread séparé démarre" Non, ce n'est pas du tout correct. Le navigateur ajoute une minuterie à sa liste de minuteries. Le navigateur met une tâche en file d'attente dans la file d'attente des travaux du thread et le thread la récupère dans le cadre de sa boucle de travaux.


Du point de vue JavaScript, la fonction timeout est un nouveau thread, elle pourrait devenir une application multi-thread, si les deux threads fonctionnaient plus longtemps. Qu'il soit ensuite sérialisé dans un moteur à thread unique est une autre affaire.



1
votes

Vous ne comprenez pas l'utilisation de setTimeout .

La mise en œuvre correcte de ce que vous demandez est:

function doHomeWork(subject, callback){
    setTimeout(callback,500);
    console.log("doing my homework:", subject)
}

doHomeWork("Maths", function(){console.log("finished my homework");});

Lorsque vous invoquez doHomeWork si vous faites deux choses (deux lignes de code): 1. Dites au navigateur d'ajouter un rappel comme nouvelle tâche à exécuter après 500 ms. 2. Imprimez console.log (...)

Après 500 ms, le navigateur ajoutera une nouvelle tâche avec le rappel qui sera appelé.


0 commentaires

0
votes

Si vous voulez attendre avant ce rappel, en particulier si le rappel est un appel API, créez une fonction distincte et renvoyez la promesse résolue à partir d'un setTimeout depuis cette fonction, et utilisez async await pour attendre cette fonction d'attente avant de faire des appels API.

Si vous n'avez rien obtenu, vous pouvez demander des explications supplémentaires.


0 commentaires