De-Async une fonction sous nodejs

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#1
Bonjour à tous, je développe actuellement un bot open source pour Touch ( TC2AeJOY83hK6jINUIVHswU74Fm / https://github.com/yovanoc/cookietouch/).

Cependant je me retrouve assez coincé. Je précise c'est sous nodejs en typescript.
Il faut que je transforme une fonction asynchrone en synchrone, je m'explique.
Je voudrais le même résultat qu'un simple await, seulement pour faire un await il faut être dans une fonction async, hors je ne peut pas passer cette fonction async.

En gros j'vais essayer de faire un truc plus simple pour vous expliquer mon soucis:

JavaScript:
console.log("First");

async function test() {
  const res = await axios.get("https://swapi.co/api/people/1/");
  console.log(res.data.name);
}

test().then(() => console.log("FAKE Last"));

console.log("TRUE Last");
Si je fais comme ceci j'aurais ce résultat:

JavaScript:
First
TRUE Last
Luke Skywalker
FAKE Last
Hors vous l'aurez compris il me faudrais:

JavaScript:
First
Luke Skywalker
FAKE Last
TRUE Last
Je me suis même créer un addon c++ (https://github.com/yovanoc/vsync)




Le premier yarn start ça correspond au screen d'au dessus, et le deuxieme avec le `Luke Skywalker` à la fin c'est en remplacant le sync.do etc etc par le simple `test()`
ça marche plutot niquel sur un projet vierge comme celui ci, mais impossible de faire fonctionner ça sous electron apparement ça me fais tout freeze. Merci à vous.
Je sais pas comment mieux expliquer le soucis, mais je suis dispo pour vocal sur discord ou autres si vous avez des solutions merci beaucoup.
 

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#2
Si vous voulez l'exemple concret du projet


Et du coup voilà le probleme, je ne sais pas comment attendre ces TRUE Ending sans mettre la fonction enqueuAction async.... c'est pour ça que le script me dis Rien à faire...
 
Inscrit
8 Septembre 2017
Messages
36
Reactions
8
#3
Si j'ai bien compris tu souhaiterais que le traitement de fake ending se fasse après true ending ?
 

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#4
Oui, en effet c'est ça, mais pour cela j'aurais juste a le mettre dans le then me dirais tu mais non, j'veux vraiment bloquer le thread en fait...
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
Pourquoi tu mets pas toute la suite dans un then ?
 

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#6
Parce qu'il faut que j'attende le retour du dequeueActions() pour terminé la fonction
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#7
Je vois difficilement comment tu peux faire cohabiter du sync et de l'async. vsync c'est une espèce de hack.
Soit tu peux tout passer en async, soit tu mets tout en sync et tu utilises des threads, et là tu peux juste faire un while(!machine){sleep()}.
Sinon tu peux essayer https://github.com/luciotato/waitfor-ES6, ça "convertit" les yield en await.

Ou alors il faut utiliser d'autres mécanismes de concurrence.
 

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#8
Je pense que je vais me servir de la librairie "co". Je viens de test sur un projet à part ça à l'air d'être exactement ce que je souhaite.

 
Inscrit
8 Septembre 2017
Messages
36
Reactions
8
#9
En java on a besoin du même système quand on utilise un thread global et que l'on souhaite faire une pause dans l'éxécution du code sans mettre en attente tous le thread, pour cela on a des cadenas ça correspond à mettre un byte 1 ou 0, a la base il vaut 0, quand t'as fonction a terminé tu le passe en 1, et en attendant du fait un while(0 ==0)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#10
En java on a besoin du même système quand on utilise un thread global et que l'on souhaite faire une pause dans l'éxécution du code sans mettre en attente tous le thread, pour cela on a des cadenas ça correspond à mettre un byte 1 ou 0, a la base il vaut 0, quand t'as fonction a terminé tu le passe en 1, et en attendant du fait un while(0 ==0)
En effet les locks servent à synchroniser des threads. En revanche, le mécanisme est totalement différent puisque en général les threads sont synchrones, donc ce sont juste plusieurs branches d'exécution en parallèle. A l'inverse, avec des coroutines, on peut exécuter une instruction alors même que la ligne précédente n'a pas fini de s'exécuter.
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#11
HTML:
console.log('First')

const main = async () => {
  const name = await test()
  console.log('name =>', name)
}

main()
  .then(() => console.log('TRUE LAST'))
 

DevChris

Membre Actif
Inscrit
12 Avril 2017
Messages
138
Reactions
24
#12
Oui, mais non. Dans l'exemple que j'ai donner c'est vrai que ça pourrais faire l'affaire mais pas dans le bot. Il faut que la fonction main() que tu as faites soit elle-même synchrone en fait
 
Inscrit
29 Decembre 2016
Messages
2
Reactions
0
#13
Une petite conf sur l'async en JS qui peut t'aider
 
Haut Bas