Bonjour,
Je recherche une solution pour transformer un bout de code asynchrone, à base de loopback multiples, en une méthode synchrone qui puisse me retourner une simple valeur une fois que tout le code asynchrone a été exécuté.
Je ne sais pas du tout comment faire, et la bidouille que j'avais utilisé juqu'à présent ne fonctionne pas.
Contexte : j'enrichis une application web qui utilise un framework que je ne peux pas modifier.
Parmis les fonctionalités utlisées, j'ai :
"QueryState" : attribut sur un bouton qui permet de tester le résultat d'une fonction synchrone. Cette fonction retourne une structure { visible: bool, disabled: bool } afin de déterminer si le bouton est visible et cliquable, en fonction de l'âge du capitaine.
Et dans cette fonction synchrone, j'ai besoin de rechercher des données en base.
J'utilise alors une fonction "u8.services.queries.execute(statement, loopback);"
Le loopback est alors exécuté une fois que la requête a été exécutée, et me permet de lire les résutlats.
Exemple :
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 u8.services.queries.execute( { statement: "select (TenantNo, MA.Contact) from (FI) where (CoGrp='" + u8.CU.Common.Uid2StaNo(uid) + "' AND CoNo='" + u8.CU.Common.Uid2SerNo(uid) + "') plus (MA) where (Contact='#6' AND Subject='Envoi des CGV')" }, function (sender, args) { let visible = false; if (args.resultSet != null && args.resultSet.rows != null && args.resultSet.rows.length > 0) { const FI_TenNo = args.resultSet.rows[0].values[0]; const MA_Type = args.resultSet.rows[0].values[1]; if (FI_TenNo >= 8000 && FI_TenNo <= 8007) { if (MA_Type == null) { visible = true; } } } // Ci-dessous la bidouille que je souhaite retirer de mon code button.visible = visible; button._updateView(); } );
Jusqu'à présent, quand j'étais dans ce cas de figure, je retournais après l'appel à la fonction asynchrone un querystate qui cache le bouton, puis dans le loopback je venais modifier directement les attributs du bouton pour le faire réapparaître en cas de besoin.
Ca, ça marche très bien quand le QuaryState est exécuté qu'une seule fois au chargement de la page : la page charge, puis après quelques dixièmes de secondes, le bouton apparaît.
Sauf que là, je suis dans un cas où le QueryState va être testé toutes les secondes, histoire de modifier l'apparance du bouton en fonction de ce qui a pu être modifié dans d'autres onglets ou par d'autres personnes, sans devoir recharger la page.
Et ma bidouille fait que le bouton clignotte du coup...
Je cherche donc une solution pour faire un truc du genre :
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 let visible = false; u8.services.queries.execute( { statement: "select (TenantNo, MA.Contact) from (FI) where (CoGrp='" + u8.CU.Common.Uid2StaNo(uid) + "' AND CoNo='" + u8.CU.Common.Uid2SerNo(uid) + "') plus (MA) where (Contact='#6' AND Subject='Envoi des CGV')" }, function (sender, args) { if (args.resultSet != null && args.resultSet.rows != null && args.resultSet.rows.length > 0) { const FI_TenNo = args.resultSet.rows[0].values[0]; const MA_Type = args.resultSet.rows[0].values[1]; if (FI_TenNo >= 8000 && FI_TenNo <= 8007) { if (MA_Type == null) { visible = true; } } } } ).wait(); return { visible: visible, disabled: false }
Comment faire ?
Partager