Je ne suis pas un programmeur JavaScript expérimenté expérimenté, mais je trouve qu'il est très difficile d'exécuter 2 fonctions de consommation de temps dans la rangée.
J'ai passé des jours à étudier des promesses ou async / attendre, mais pas le succès jusqu'à présent. P>
console.log("synch 1"); slowFunction1(); slowFunction2(); console.log("synch 2");
3 Réponses :
Vous pouvez envelopper vos fonctions dans une promesse comme celle-ci, et ne résolvez que lorsque vous souhaitez que le code continuait:
p>
function slowFunction1() { return new Promise(resolve => { setTimeout(() => resolve(), 1000) }) } function slowFunction2() { return new Promise(resolve => { setTimeout(() => resolve(), 1000) }) } async function main() { console.log("synch 1"); await slowFunction1() await slowFunction2() console.log("synch 2"); } main()
Je pense que je peux comprendre mieux async / attendre, mais ce qui me casse-t-on, c'est où je devrais insérer exactement toutes les fonctions mathématiques en slowfonction2 () par exemple. Juste au-dessus de retour Nouvelle promesse?
Je devrais savoir quelles sont vos fonctions mathématiques: P
Les fonctions sont comme CalculateOOPORCE (Array [20000]); CalculezPearsonchisQuareTest (Array [20000]); J'ai réussi à les exécuter séquentiellement sans problème et ils fonctionnent tous dans une fonction docalculation (tableau [2000]). Maintenant, je veux insérer la docalculation () dans votre exemple ci-dessus et je suis confondu avec la syntaxe. Cette fonction doit terminer avant de passer à l'étape suivante.
Je recommanderais de créer une autre question avec le code de chaque fonction et de poser là-bas. C'est une mauvaise idée d'essayer de résoudre un problème que j'ai très peu connaissance de la section des commentaires. Si vous le souhaitez, vous pouvez créer une question et m'envoyer le lien ici et je vais le regarder
Ce qui me confond est l'utilisation de la sécurité dans le retour: retour Nouvelle promesse (résolution => {Settimeout (() => résolution (), 1000)}). Je comprends qu'il est utilisé pour simuler une fonction lente. Si j'ai une myslowfuncunc () à la place, comment cela serait-il inséré dans votre exemple?
Cela dépend de la fonction de la fonction. Si la fonction n'est pas aussi asynchrone, vous n'avez pas besoin de vous inquiéter des promesses et du lot, mais si c'est le cas le plus simple de rendre votre code de votre code dans l'ordre consiste à renvoyer une promesse de votre fonction lente et à utiliser un .Ce () Pour accéder à la valeur retournée. Par les sons, vous Ne devez pas utiliser de promesses, si vous ne faites que exécuter du code arithmétique.
La seule raison pour laquelle j'ai utilisé Settimeout était d'attendre une seconde avant de retourner une valeur, vous ne l'utiliseriez pas dans votre code. Vous pouvez supprimer le SettimeOut et il exécuterait toujours séquentiellement.
Vous avez obtenu cette droite, vous essayez d'obtenir une tâche code> asychronique code> asychronique.
une tâche qui prendra du temps Pour terminer. P> Way 1 - Callbacks strong> P> Vous devez donner un rappel à votre autre tâche.
Permettez-moi de vous donner un exemple. P> p> const myHugeTaskPromise = new Promise(resolve => {
// Do my huge task no matter how much time it takes
console.log('I will complete first')
resolve()
})
myHugeTaskPromise.then(()=>{
console.log('Need to done when my promise get fulfilled')
})
Je reçois: "Besoin de faire quand ma promesse est remplie" 0 1 2 3 4 Quand je cours: const myHugetaskPromise = nouvelle promesse (résolution => {// fait ma tâche énorme, peu importe combien de temps il prend ralenti (); résolution ();}) myhugetaskpromise.then (((((() => {console.log ("besoin de faire quand ma promesse est remplie")})})})} () {pour (let i = 0, p = promesse.Resolve () ; i <5; i ++) {p = p.then (_ => nouvelle promesse (resolve => Settimeout (fonction () {console.log (i); résolution ();}, math.random () * 1000) )); }}
Je suis désolé, cela ne fonctionne pas. J'ai essayé une fonction qui utilise le délai d'attente et génère des chiffres dans la // faire ma tâche énorme, peu importe combien de temps il prend et je prends: hey je suis la première tâche '4: 47: 15.056 hey je suis après la première tâche' 0 1 2 3 4
dépend de ce que vous essayez d'atteindre et de ce que l'environnement est. Je suppose que la fonction lente bloque et que vous allez pour le fil principal de ne pas être bloqué pendant l'exécution. En supposant que vous parlez de:
Un seul exemple de code serait le suivant: p>
Je ne me dérange pas de bloquer, je veux que une fonction spécifique soit entièrement exécutée avant de passer à autre chose, mais ne peut pas le faire avec attendre / async ou promesse.
Avez-vous recherché des promesses?
Vous voulez exécuter SlowFunction1 et SlowFunctuion2 simultanément?
Notez que même si vous exécutez des fonctions lentes de manière asynchrone, elles ne seraient probablement pas exécutées dans des threads différents. Donc, ils ne courront pas parallèlement - ils seraient toujours exécutés séquentiellement, mais vous pourriez avoir un peu de "salle de respiration" entre eux. Cela pourrait permettre à un UI de rattraper et de mettre à jour entre les appels, par exemple. Est-ce ce que vous êtes après ou voulez-vous les exécuter en parallèle?
Cet article peut être utile: Programmation parallèle en JavaScript à l'aide de travailleurs Web
Je préfère toujours une raison de la descente à la question / réponse. Cela aide vraiment les gens à grandir en communauté avec une confiance. Raison d'aider à prévenir les erreurs à l'avenir
@Satyampathak je suis d'accord. C'est particulièrement ennuyeux quand il est fait à de nouveaux utilisateurs - un vétéran pourrait comprendre quoi (si quelque chose) a tort d'attirer un bowvote, mais un nouvel utilisateur ne comprendrait pas nécessairement cela. En outre, il semble que certaines personnes viennent de bownvotez des trucs pour le plaisir - je n'ai trouvé aucune autre explication, comme je vois des bowvotes sur les bonnes réponses de bonnes réponses sans problèmes ou pas de problèmes qui ne garantissent pas vraiment un bowvote (par exemple, une grammaire mineure ou des correctifs de faute de frappe nécessaires).
Pourriez-vous s'il vous plaît me montrer ce qui est à l'intérieur de ces fonctions (en d'autres termes: qu'est-ce que vous essayez de faire) et comment cela se comporte et quel comportement vous attendiez à la place ...
@ Enno.void: Non, séquentiellement