Bonjour cher tous,
Nous sommes amenés à appeler des fonctions telles que jeedom.cmd.execute, cmd.byId, eqLogic.byId, etc.
Je viens de découvrir que ces fonctions s’exécutent de manière asynchrone, du coup je n’ai aucune maitrise sur le flux de contrôle, et je me retrouve à utiliser des données avant que celles ci soient correctement valorisées.
J’ai l’impression que cela impose d’utiliser pleinement les données au plus près de leur mise à jour : impossibilité (?) de mutualiser les traitements sous formes de fonctions (synchrones), i.e. il faut dupliquer le code; impossibilité (?) de modulariser le code en séparant les entrées, les traitements et sorties (potentiellement multiples).
Comment faites vous pour :
Q1: forcer le traitement en mode synchrone, s’il faut choisir entre <<un impact négatif sur la navigation de l’utilisateur final>> et un affichage incorrect.
Q2: ou bien pour mettre en place des points de synchronisation (par exemple) avec onreadystatechange / open / send
Q3: ou bien dispose-t-on de toute autre méthode recommandée ?
Je vous propose le cas d’école suivant :
function Get_Sensor_Date(info_id) {
jeedom.cmd.byId ({
id: info_id,
success: function(result_cmd_byid) {
jeedom.eqLogic.byId ({
id: result_cmd_byid.eqLogic_id,
success: function(result_eqlogic_byid) {
// n.b. valorisation de la donnée recherchée (e.g.)
let date = result_eqlogic_byid.status.lastCommunication;
} // end success
}); // jeedom.eqLogic.byId
} // end success
}); // jeedom.cmd.byId
// n.b. peu importe je crois la position du return; on peut aussi utiliser une donnée globale au script
return date;
} // end function
My_Date = Get_Sensor_Date (X);
// utilisation de la donnée récupérée
// etc.
En vous remerciant par avance pour votre éclairage, pour le partage de votre expertise.
Non je n’en suis pas sur.
Je suis tombé sur cette problématique en essayant d’écrire un widget.
Faut-il rediriger ce post, et si oui comment et vers où ?
Il faudrait rediriger vers le forum développeurs, mais malheureusement pour toi c’est un forum privé
La bonne façon de faire, pour rester en asynchrone, c’est de mettre le code « utilisation de la donnée récupérée » dans une autre fonction, et mettre cette fonction en paramètre de ta fonction.
Dans ta fonction le « return date » ne renvoie rien puisque la fonction asynchrone n’a pas encore répondu.
function Get_Sensor_Date(info_id, fn_traitement) {
jeedom.cmd.byId ({
id: info_id,
success: function(result_cmd_byid) {
jeedom.eqLogic.byId ({
id: result_cmd_byid.eqLogic_id,
success: function(result_eqlogic_byid) {
// traitement de la donnée récupérée:
fn_traitement(result_eqlogic_byid.status.lastCommunication;);
} // end success
}); // jeedom.eqLogic.byId
} // end success
}); // jeedom.cmd.byId
} // end function
function traiter_date(date) {
// utilisation de la donnée récupérée
// etc.
}
My_Date = Get_Sensor_Date (X, traiter_date);
Je te conseille un peu de lecture
Et surtout, ne pas dupliquer le code, au contraire il faut le regrouper dans des fonctions / classes / modules!
Oui je savais pour le « return date ».
Un grand merci Pifou pour ce lien vers de la lecture. C’est exactement le genre de porte d’entrée que je recherchais.
Je vais tirer sur la ficelle, m’exercer avec les promises, explorer le chainage, les erreurs, les async/await, etc.
Il s’agit de quitter une façon de programmer à l’ancienne
non dans ce cas-ci c’est pas ca qui est utilisé du tout, on parle de « simple » fonctions ajax qui font un callback asynchrone. le chainage (then) et les async/await sont utilisés dans du nodejs mais pas vraiment en javascript web (ca peut, mais c’est pas utilisé dans le framework js de jeedom)
Merci pour ton retour Nebz
oui j’ai bien vu que dans la réponse faite il s’agissait d’un simple callback
et le lien documentaire va plus loin avec la notion de promise
avant de poster j’avais regardé entre autres dans cmd.class.js (n.b. dépourvu du moindre commentaire) mais je n’y ai pas encore trouvé de réponse
comment mettre en place un rendez vous pour assurer que les données soient bien prêtes avant usage.
comment imposer un mode synchrone (à éviter j’imagine)
comprendre que ces questions sont posées par un newbie
À éviter en effet… Tout se passe dans le callBack Success, c’est à cet endroit et uniquement à cet endroit que tu peux t’assurer que les données seront là.
Oui j’ai parlé u peu vide des promises, mais en fait on n’en utilise pas du tout dans jeedom (ou si?) on n’envoie que des fonctions de callback dans l’API ajax de jquery…
Mais il me semble que la promise est un objet javascript natif, est-ce qu’on ne pourrait pas l’utiliser - hors jquery - dans nos plugins ?
(je m’excuse si je dis des bêtises mais le front c’est pas encore ma spécialité )