Forum: PC-Programmierung Javascript callback


von Luke (Gast)


Lesenswert?

Bin langsam am Verzweifeln...
Ich verstehe folgenden Code nicht:



Accessory.prototype.getValue = function(callback) {
    if (this.hasStateToDisplay) {

     this.query("displayRawState",callback);

    } else {
        callback("Accessory does not support values");
    }
};



Das funktioniert zwar, aber wenn ich nun den Wert von this.query noch 
runden möchte, dann bringe ich den Wert nicht mehr zurück zu "callback".

     var value = this.query("displayRawState");
     var value.toFixed(1,callback);

Was mache ich falsch?

Danke für jede Hilfe.

von Luke (Gast)


Lesenswert?

var value.toFixed(1,callback);
ist natürlich

     var value = value.toFixed(1,callback);

geht aber trotzdem nicht...

von Jan H. (j_hansen)


Lesenswert?

Luke schrieb:
> this.query("displayRawState",callback);

this.query ist eine Funktion, die (hier) zwei Parameter entgegen nimmt. 
Meine Glaskugel sagt, dass die das macht, was du im ersten Parameter 
übergibst ("displayRawState"), und damit den Callback aufruft (ebenfalls 
eine Funktion). Kann sein, dass die Funktion this.query gar keinen 
Rückgabewert hat.

Luke schrieb:
> var value = this.query("displayRawState");

OK, du rufst hier eine Funktion mit einem Parameter weniger auf als 
oben. Kann stimmen, kann auch Blödsinn sein. Und du weist den 
Rückgabewert der Variable "var" zu. Aber weißt du überhaupt, was die 
Funktion zurückgibt? Nichts, "Hubert" oder "Trololo"?

Luke schrieb:
> var value = value.toFixed(1,callback);

Jetzt hast du deine "value", wo eventuell sogar das drinnensteht, was du 
dir erhoffst, nämlich anscheinend ein Float. Ob das wirklich so ist, 
würde ich wie oben geschrieben erst einmal überprüfen. Aber nehmen wir 
an, es ist so.

Jetzt rundest du das mit ".toFixed", und weist das wieder der Variable 
"value" zu. Soweit so gut. Aber ".toFixed" nimmt nur einen Parameter 
entgegen, du übergibst zwei. Dein "callback" wird also gleich einmal 
ignoriert.

Mit (mittlerweile schon sehr viel) Glück ruft 
"this.query("displayRawState",callback);" einfach nur den Callback mit 
dem Ergebnis auf. Dann könntest du das mit:
callback(value);
nachbilden.

Besser ist es aber, wenn du das Runden in deiner Callbackfunktion 
machst.

: Bearbeitet durch User
von Luke (Gast)


Lesenswert?

Danke für die Erklärungen.

Das hier ist einfach das einzige was funktioniert (kann sein, das der 
Code nicht optimal ist):
     this.query("displayRawState",callback);


Ich will aber noch vorher runden...

von Jan H. (j_hansen)


Lesenswert?

Luke schrieb:
> Das hier ist einfach das einzige was funktioniert

Genau genommen funktioniert auch das nicht. Zumindest nicht mit dem 
Code, den du gepostet hast. Bitte poste lauffähigen Code, dann kann man 
dir auch helfen ohne wild herumraten zu müssen.

Luke schrieb:
> Ich will aber noch vorher runden...

Da sehe ich zwei Möglichkeiten:
1) Die "this.query" angreifen und schon dort runden.
2) So wie du es schon versucht hast, was aber nur unter den von mir oben 
genannten Bedingungen funktionieren wird.

von Luke (Gast)


Lesenswert?

Vielleicht hilft ja das hier: 
https://raw.githubusercontent.com/webdeck/homebridge-indigo/master/index.js

Ich möchte lediglich eine andere Stelle aus dem JSON auslesen und diese 
runden. 24.00000 wird nämlich nicht akzeptiert, sondern nur 24.0.

von fbi (Gast)


Lesenswert?

Müßte eigentlich in etwa so gehen:
1
this.query("displayRawState",function(error, value)  {
2
    if (error) {
3
      callback(error);
4
    } else {
5
      callback(undefined, value.toFixed(1));
6
    }
7
  });

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.