OJC Posté(e) le 8 janvier 2018 Signaler Posté(e) le 8 janvier 2018 Bonjour, Je rencontre un souci lié à l'asynchronicité de net.HTTPClient(). Comment faire patienter le script le temps que les données arrivent, sachant que j'ai besoin de les faire 'sortir' (donc le traitement ne peut pas de faire à l'intérieur de net.HTTPClient()) ? En gros, avoir le même résultat que dans un VD avec Net.FHttp() : j'appelle une fonction qui fait un socket:request() et qui me retourne response. J'ai essayé (sans grande conviction) avec un fibaro:sleep(), mais bien sûr ça ne marche pas... Auriez-vous une idée ?
OJC Posté(e) le 8 janvier 2018 Auteur Signaler Posté(e) le 8 janvier 2018 Au final, j'ai fait comme ça, même si ce n'est pas totalement satisfaisant : getdata=function(f,u) local socket=net.HTTPClient() socket:request(u,{success=function(r)f(r)end,error=function(r)f(r)end,options={method='GET'}}) socket=nil end catch=function(r) if not r then getdata(catch,'http://x.x.x.x:xxxx/action') else print('response = ',x) end end catch() Si les pros du lua ont une meilleure idée ??
pepite Posté(e) le 8 janvier 2018 Signaler Posté(e) le 8 janvier 2018 Moi je passe par là pour suivre et apprendre ;-) Désolé, je ne peux pas t'aider ;-)
Steven Posté(e) le 8 janvier 2018 Signaler Posté(e) le 8 janvier 2018 Je ne peux malheureusement pas t'aider mais ceci fonctionne ... par contre pas sur la HC2 mais cela peut te donner une piste. local r, c, h, s = http.request{ url = "http://"..hc2_ip.."/api/"..urlapi, sink = ltn12.sink.table(resp), method = "GET", headers = { ['Authorization'] = "Basic " .. (mime.b64(hc2_user..":"..hc2_pwd)), } } print(resp[1]) return json.decode(resp[1])
Krikroff Posté(e) le 9 janvier 2018 Signaler Posté(e) le 9 janvier 2018 @OJC, pas de "await" disponible a ma connaissance. j'avais codé ceci à l'époque dans les plugins pour contrôler mes traitements asynchrones ... --! async object async={} --! wait function --@ param condition The condition --@ param callback The callback --@ param milliseconds (optional) The number of milliseconds to wait before executing the code --@ return An integer with the ID value of the timer that is set. Use this value with the clearTimeout() method to cancel the timer. function async:wait(condition, callback, milliseconds) assert(type(condition)=='function', 'wait(condition*, fn, milliseconds) condition should be a function') assert(type(fn)=='function', 'wait(condition, fn*, milliseconds) fn should be a function') if (condition()) then if (callback and type(callback)=='function') then callback() return 0 end return else return setTimeout(function() self:wait(condition, callback) end, tonumber(milliseconds or 250)) end end Pour l'utilisation par exemple... self:connectApi() async:wait((function(...) return (self.isConnected==true) end), function() self:onConnected() self:getData() end) 1
OJC Posté(e) le 9 janvier 2018 Auteur Signaler Posté(e) le 9 janvier 2018 Merci beaucoup @Krikroff, je vais voir comment adapter ça à ce que je veux faire.
OJC Posté(e) le 9 janvier 2018 Auteur Signaler Posté(e) le 9 janvier 2018 @Krikroff Au final, j'ai l'impression que ton morceau de code fait double emploi avec net.HTTPClient puisque la fonction request() permet déjà de déclencher l'exécution d'une ou deux fonctions (success et error). Je pense que vouloir supprimer l'asynchronicité d'une librairie qui est spécifiquement conçue pour l'être n'est tout simplement pas possible...
Krikroff Posté(e) le 9 janvier 2018 Signaler Posté(e) le 9 janvier 2018 L'idée c'est plutôt de synchroniser des actions asynchrones et pas de supprimer l'asynchronicité Alors d'une certaine manière oui c'est redondant avec net.HTTPClient mais le code risque de devenir très vite illisible est difficilement maintenable dans le cas de scénarios complexes.
OJC Posté(e) le 9 janvier 2018 Auteur Signaler Posté(e) le 9 janvier 2018 Oui Mais ce que je suis en train de faire, c'est un objet pour faciliter l'utilisation de node-sonos-http-api, ce qui signifie que ce n'est pas l'objet lui-même qui est censé traiter le retour mais l'utilisateur final. Donc, du coup, j'ai retenu le principe de passer en paramètre la fonction devant être exécutée lorsque request() a reçu la réponse du serveur. PS @Yohan : Au fait, avant il était possible dans un post de changer la police, ce qui était bien pratique... Pourquoi l'option a-t-elle été supprimée ?
Lazer Posté(e) le 9 janvier 2018 Signaler Posté(e) le 9 janvier 2018 il y a 9 minutes, OJC a dit : j'ai retenu le principe de passer en paramètre la fonction devant être exécutée lorsque request() a reçu la réponse du serveur C'est ce que je fais aussi, c'est un peu lourd, mais ça fonctionne....
Yohan Posté(e) le 15 janvier 2018 Signaler Posté(e) le 15 janvier 2018 Le 09/01/2018 à 11:53, OJC a dit : Oui Mais ce que je suis en train de faire, c'est un objet pour faciliter l'utilisation de node-sonos-http-api, ce qui signifie que ce n'est pas l'objet lui-même qui est censé traiter le retour mais l'utilisateur final. Donc, du coup, j'ai retenu le principe de passer en paramètre la fonction devant être exécutée lorsque request() a reçu la réponse du serveur. PS @Yohan : Au fait, avant il était possible dans un post de changer la police, ce qui était bien pratique... Pourquoi l'option a-t-elle été supprimée ? Salut @OJC, l'option est de nouveau disponible. 2
Messages recommandés