NEWS
Warten auf Ergebnis Internetabfrage await/async
-
Ich habe ein Problem wenn das Internet nachts nicht verfügbar ist und dadurch die Heizung ggf falsch gestellt wird. Es gibt dazu auch ein Issue beim ical Adapter. Da der ical Adapter eher weniger weiterentwickelt wird will ich eine eigene Lösung bauen. Nur funktioniert sie nicht. Ich vermute das Script wartet nicht auf das Ergebnis von der Axios abfrage? Wie kann ich das ändern? Ping Adapter möchte ich nicht nutzen, da ich nicht alle x Sekunden eine Abfrage machen möchte sondern nur einmalig beim Scriptstart:
/************************** * Prüft ob google erreichbar ist und damit ob eine Internetverbindung besteht * * 18.05.21 V1.00 Erste Version **************************/ const logging = true; const debugging = false; var Internet = false; // **************************** ab hier keine Änderung ********************************************************* function func_check_Internet(){ var Internet = false; const url = 'http://google.de'; const axios = require('axios'); axios({ method: 'get', baseURL: url, timeout: 4500, responseType: 'json' }) .then((response) => { if(debugging){ console.log('data:' +response.data); console.log('Status: ' +response.status); console.log('Header:' +response.headers); } if(response.status = 200){ if(logging){ log('Internetverbindung scheint ok zu sein.') } Internet = true; } else{ if(logging){ log('Internet derzeit nicht verfügbar: '+response.status,'warn') } } }) .catch( (error) => { // handle error log('Fehler bei der Abfrage der Internetverbindung: '+error,'warn'); } ); return(Internet) } function func_main(){ Internet = func_check_Internet(); log('Internet: '+Internet) }
Im Log sieht man eigentlich das er bereits Internet als false meldet bevor der andere Log Eintrag zeigt das Internet verfügbar ist. Wie kann ich dem Script sagen das er erstmal die function func_check_Internet komplett ausfürhren soll? Ich hoffe await könnte helfen. Weiß aber nicht wie ich das einbaue?
-
Am besten liest du mal hier:
https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95# -
@cash probiere mal so
const axios = require('axios').default; async function checkInet(){ let res = await axios.get('https://google.de'); return res.status === 200 ? 'Internet ist ok' : 'Internet nicht erreichbar'; } async function doIt(){ log('Inet: ' + await checkInet()); } doIt();
-
@alcalzone Danke. Das hatte ich bei der recherche schon gefunden aber leider verstehe ich davon nur die Hälfte. Dazu bin ich einfach noch nicht fit genug.
@fastfoot Danke für das Beispiel. Habe jetzt mein Script angepasst. Ich glaube so passt es. Mal schauen wie ich nun weiter mache um mein Problem mit dem ical Adapter zu lösen.
Hier meine Version:
/************************** * Prüft ob google erreichbar ist und damit ob eine Internetverbindung besteht * * 18.05.21 V1.00 Erste Version **************************/ const logging = true; const debugging = false; var Internet = false; // **************************** ab hier keine Änderung ********************************************************* async function func_check_Internet(){ var Internet = false; const url = 'http://google.de'; const axios = require('axios'); await axios({ method: 'get', baseURL: url, timeout: 4500, responseType: 'json' }) .then((response) => { if(debugging){ console.log('data:' +response.data); console.log('Status: ' +response.status); console.log('Header:' +response.headers); } if(response.status = 200){ if(logging){ log('Internetverbindung scheint ok zu sein.') } Internet = true; } else{ if(logging){ log('Internet derzeit nicht verfügbar: '+response.status,'warn') } } }) .catch( (error) => { // handle error log('Fehler bei der Abfrage der Internetverbindung: '+error,'warn'); } ); return(Internet); } async function func_main(){ Internet = await func_check_Internet(); log('Internet: '+Internet) } //beim Starten func_main();
-
@cash sagte in Warten auf Ergebnis Internetabfrage await/async:
await axios(...).then(...).catch(...)
ist ein anti-pattern. Das geht besser:
https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95#kapitel-6-ein-paar-anti-patterns -
@alcalzone wenn ich Javascript richtig verstehen würde... Danke auf jeden Fall das Du mal drüber geschaut hast.
Ich habe das Script nun angepasst. Mein neuer Versuch (mehr oder weniger wie von @fastfoot nur mit Errorbehandlung:
const axios = require('axios').default; //const url = 'http://google.de'; const url = 'http://ardd.de'; //Liefert Fehler var debugging = true; async function func_check_Internet(){ try{ let res = await axios.get(url, {timeout: 4500, responseType: 'json' } ) if(debugging){ console.log('data:' +res.data); console.log('Status: ' +res.status); console.log('Header:' +res.headers); } return res.status === 200 ? true : false; } catch (e) { log('Fehler: '+e) //var status; //return status = false; } } async function doIt(){ try{ var Internet = await func_check_Internet() log('Ergebnis: '+Internet) } catch (e) { log('Fehler: '+e) } if(!Internet){ log('Keine Internetverbindung vorhanden',"warn"); } else{ log('Internetverbindung vorhanden') } } doIt();
Ist es jetzt so besser? Wie sieht das denn mit dem catch(e) aus? Muss das bei beiden Sachen hin? Ich glaube nicht, da ich ja mit dem ersten catch schon den Fehler abfange und somit immer in der function doit etwas ankommt (im Fehlerfalle hat undefined).
-
@cash Alles richtig, was du am Ende schreibst. Da du in
func_check_Internet
schon alle möglichen Fehler behandelst, ist das try-catch um den Aufruf nicht nötig.