0
votes

En attente de la fonction asynchrone, qui ne prend pas de rappel et ne retourne pas une promesse, à exécuter sans changer l'autre fonction

J'essaie actuellement d'ajouter certaines fonctionnalités à une application Web existante écrite dans JavaScript. Mon problème est que je souhaite appeler une fonction qui appelle à nouveau certaines fonctions asynchrones et je souhaite exécuter une fonction non avant que toutes les autres fonctions n'ont été exécutées.

La fonction que j'appelle ne nécessite pas de rappel et non pas t Renvoie une promesse (ce qui est bien sûr une très mauvaise pratique).

Je pourrais refroidir les fonctions existantes afin que la fonction que j'appelle renvoie une promesse, mais cela nécessiterait beaucoup de temps et d'efforts.

La solution idéale pour moi serait une technique qui me permettrait d'attendre la fonction que j'ai appelée et toutes les fonctions appelées à nouveau par cette fonction à exécuter.

Un autre acceptable L'option serait une technique qui me permettrait d'exécuter une fonction après l'exécution de toutes les fonctions asynchrones.

Ainsi, transfert cela à un exemple simple, je voudrais exécuter une fonction après la fonction dosomotringsaSync a été exécutée sans changer cette fonction. xxx

J'ai essayé avec une fonction de sécurité () et de zéro millisecs, mais cela ne fonctionne pas car il est exécuté avant la fonction dosomoSaSaSync . Sachez que dans cet exemple simple.

Il y a beaucoup d'options pour exécuter quelque chose après DosomoTrosaSaSync mais j'ai besoin d'une technique qui me permet d'exécuter quelque chose après DosomoRoSaSync sans changer cette fonction.

Toute astuce est très appréciée.


3 commentaires

Je suis d'accord avec Todd. Si vous ne pouvez pas changer dosomotringsaSync () Votre seul espoir recherche un effet secondaire que vous pouvez regarder à la place. Par exemple, si DosomoThoordSync crée un fichier sur le disque dur, vous pouvez interroger le système de fichiers tous les x milisecondes avec un seinterval jusqu'à ce que le fichier soit créé et soit lisible, puis résoudre la promesse. Un délai d'attente ne fera rien si vous n'avez pas quelque chose à attendre. Il suffira de différer le problème jusqu'à la journée DosomoMoSaSaSync () prend plus de temps que le délai d'attente. Qu'est-ce que dosomoordingsaSaSync () réellement faire? Ensuite, nous pouvons rechercher des solutions de contournement appropriées.


Oui, la surveillance d'un effet secondaire est une bonne solution de contournement. Cependant, la fonction réelle dosomoRoSync fait des choses complexes que je ne comprends pas complètement. Fondamentalement, le DosomoRoSync modifie un paramètre d'objet, qui informe certains auditeur qui n'appellent à nouveau certaines fonctions. Donc, il est très difficile de négliger ce que dosomoordatangaSync () fait réellement :-(


Avez-vous accès à cet objet? Nous pouvons envelopper cet objet dans une structure proxy ou autre, afin que nous puissions écrire une fonction de setter pouvant résoudre notre promesse lorsque la propriété de l'objet change. Avez-vous accès à l'auditeur? Nous pourrions remédier à l'auditeur à travers un autre auditeur qui résoudra notre promesse à nouveau. Donc, tout ce que vous pouvez ajouter du code ou un changement de ce que vous dites, si cela se produit, DosomoSaLoSaSync () est fini sera probablement suffisant.


3 Réponses :


0
votes

Vous semblez rechercher le mot-clé . XXX


6 commentaires

WaitsForers () devrait être la fonction ASYNC, car: N'oubliez pas que le mot clé attendu n'est valable que dans les fonctions ASYNC. Si vous l'utilisez en dehors d'une fonction ASYNC de la fonction, vous obtiendrez une syntaxeRorror. et Waitforme () devrait renvoyer une promesse dans n'importe quel exemple de vie réel.


bonne prise sur l'async manquant. Pourquoi devrait-il rendre une promesse?


Depuis que le problème de l'OP est que la fonction qu'il souhaite appeler ne retourne pas une promesse ou de prendre un rappel, je pensais qu'il était pertinent de mentionner qu'il est inutile de rendre la fonction asynchrone si elle ne renvoie rien depuis le résultat de La promesse sera toujours indéfinie ou une erreur.


Et si cela retourne quelque chose, devrait-il encore être une promesse à l'intérieur de la fonction ASYNC?


Question bizarre. Mais sûr. Dans la fonction async waitsforers () . ( waitforme () n'a pas besoin du mot-clé de fonction ASYNC, puisqu'il n'attend rien) il ne peut y avoir rien. Si les gens veulent pouvoir attendre waitsforers () , il devrait également renvoyer une promesse. Le point est des fonctions asynchrones qui ne renvoient pas une promesse sont équivalentes à une fonction synchrone. S'il n'y a rien à attendre pour attendre, cela équivaut à seulement 3 console.log () appels directement après l'autre, mais seulement plus lent.


Je vois. Merci! Beaucoup d'aide pour un JS Newb.



1
votes

Vous ne pouvez pas réaliser ce que vous voulez sans changer DosomoRoSaSync . Cette fonction se termine immédiatement et ne laisse aucun moyen de détecter quand ce settimeout finitions. Sauf si vous pouvez trouver un autre effet secondaire pour surveiller, vous n'avez pas de chance.

Bien techniquement, il serait facile d'exécuter quelque chose immédiatement après DosomoRoSaSaSync Finitions exécutions. Il finit presque immédiatement. Ce que vous ne pouvez pas faire, c'est d'exécuter quelque chose après les déclencheurs Settimeout . Parce que dosomoordingsaSaSync ne renvoie aucun lien à ce qu'il a fait en interne.


2 commentaires

Oui, c'est ce que je pensais aussi. Même si je ne peux pas comprendre pourquoi il n'est pas possible dans JavaScript.


Qu'est-ce qui vous confondre toujours? Il n'y a absolument aucun lien avec le Settimeout dans votre code. Sans liens, comment allez-vous le surveiller de la finition? Mettez un autre moyen, la raison exacte des personnes utilisent des rappels et des promesses consiste à permettre un tel suivi.



0
votes

Vous pouvez modifier la fonction ci-dessus,

p>

var counter = 0;
var doSomethingAsync = (timer) => {
  setTimeout(() => {
    console.log("do Something Async : ",(counter+1));
    counter++;
    youWantToExecuteAtLast();
  }, timer);
};
// do something after doSomethingAsync has been executed ... 

function youWantToExecuteAtLast() {
  if(counter === 3)
    alert("Three calls are done");
};

doSomethingAsync(2000);
doSomethingAsync(4000);
doSomethingAsync(6000);


2 commentaires

Oui, cela fonctionne, mais j'ai besoin d'une technique sans changer DosomoRoSaSync :-(


Veuillez vous reporter à, Javascript.info/async-await Demandez si ce n'est pas compris.