NEWS
Adapter-Entwicklung / getState / Callback Fehler
-
Hallo zusammen, ich kämpfe immer noch mit der Adapter-Entwicklung. Insbesondere async/await bzw. Promises machen mir zu schaffen. Ich habe hier folgenden Code Snippet:
async onReady() { await this.getState('lastUpdate', function (err, state) { if (state != null) { let now = new Date().getTime(); if (now < (state.ts + 10 * 1000)) { this.log.warn("adapter ran less than 10 minutes earlier. Delaying."); this.stop(); // stop adapter right here (on schedule mode) } } }); this._queryServer(); }
Bei der Ausführung bekomme ich folgenden Fehler:
TypeError: Cannot read property 'warn' of undefined at Socket.<anonymous> (/opt/iobroker/node_modules/iobroker.ryd/main.js:98:15) at Socket.onack (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:312:9) at Socket.onpacket (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:236:12) at Manager.<anonymous> (/opt/iobroker/node_modules/component-bind/index.js:21:15) at Manager.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) at Manager.ondecoded (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:332:8) at Decoder.<anonymous> (/opt/iobroker/node_modules/component-bind/index.js:21:15) at Decoder.Emitter.emit (/opt/iobroker/node_modules/component-emitter/index.js:134:20) at Decoder.add (/opt/iobroker/node_modules/socket.io-parser/index.js:246:12) at Manager.ondata (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:322:16)
Wieso kann ich in dem getState Callback nicht auf die Adapter Funktionen (via this. ...) zugreifen? adapter.log.warn .... klappt auch nicht...
-
Ich antworte mir mal selber:
man muss beim adapter init noch folgendes definieren:Außerhalb der Klasse, globale Variable:
var gthis;
im onReady:
async onReady() { gthis = this;
im callback dann Zugriff via:
if (now < (state.ts + 10 * 1000)) { gthis.log.warn("adapter ran less than 10 minutes earlier. Delaying."); gthis.stop(); // stop adapter right here (on schedule mode) }
-
@NemoN sagte in Adapter-Entwicklung / getState / Callback Fehler:
Wieso kann ich in dem getState Callback nicht auf die Adapter Funktionen (via this. ...) zugreifen? adapter.log.warn .... klappt auch nicht...
Weil du dann innerhalb einer Callback Funktion bist und der this-Kontext sich dann auf die Funktion bezieht. Was du da tust mit dem Mix aus Promises und Callbacks macht wenig Sinn.
Promises (+ Async/Await was auf Promises basiert) funktioniert nur mit Methoden die auch Promises zurück liefern.getState
tut dies nicht... was du brauchst istgetStateAsync
zudem tut ein await Block die Asynchronität aus dem Code nehmen und wartet an der Stelle bis das Promsie returned wurde. D. h. es ersetzt Callbacks.Dein Code oben:
async onReady() { try { const state = await this.getStateAsync('lastUpdate'); const now = new Date().getTime(); if (now < (state.ts + 10 * 1000)) { this.log.warn("adapter ran less than 10 minutes earlier. Delaying."); this.stop(); // stop adapter right here (on schedule mode) } } catch (e) { // handle error here } this._queryServer(); }
-
@NemoN sagte in Adapter-Entwicklung / getState / Callback Fehler:
Ich antworte mir mal selber:
Wenn du unbedingt Callbacks brachst, verwende lieber Arrow-Funktionen anstatt this-Referenzen zu speichern:
this.getState('lastUpdate', (err, state) => {
anstatt
this.getState('lastUpdate', function (err, state) {
um dafür zu sorgen, dass
this
immer das richtige meint.Oder nimm direkt die Async-Versionen der Methoden wie @foxriver76 geschrieben hat. Da gibts das Problem gar nicht erst.
-
Und wenn du tatsächlich callbacks verwendest wie von @AlCalzone gezeigt, brauchst du kein
async
vor der Klassenmethode und auch keinawait
bei deinen Methoden/Funktionsaufrufen. -
Danke für die Hinweise, langsam sehe ich klarer