ioBroker / ioBroker.javascript

Script engine for JavaScript and Blockly
MIT License
322 stars 120 forks source link

[Bug]: $Selector liefert nicht nur eine ID-Liste #1503

Closed paul53 closed 5 months ago

paul53 commented 5 months ago

I'm sure that

Script type

Javascript

The problem

Der $Selector liefert zu viele Einträge im Objekt (s. Log) const ids = $('*(functions=Beleuchtung)[role=switch.light]'); log(ids); sollte einen Eintrag liefern: { '0': 'alias.0.Keller.Licht.Waschkueche', length: 1}

iobroker.current.log (in debug mode!)

{ '0': 'alias.0.Keller.Licht.Waschkueche', length: 1, each: [Function (anonymous)], getState: [Function (anonymous)], getStateAsync: [AsyncFunction (anonymous)], getBinaryState: [Function (anonymous)], getBinaryStateAsync: [Function (anonymous)], setState: [Function (anonymous)], setStateAsync: [AsyncFunction (anonymous)], setStateDelayed: [Function (anonymous)], setBinaryState: [Function (anonymous)], setBinaryStateAsync: [AsyncFunction (anonymous)], on: [Function (anonymous)], [Symbol(Symbol.iterator)]: [GeneratorFunction (anonymous)] }

Version of nodejs

18.19.1

Version of ioBroker js-controller

5.0.17

Version of adapter

7.8.0

klein0r commented 5 months ago

Der $Selector liefert zu viele Einträge im Objekt (s. Log)

Was ist daran falsch? Das deckt sich doch mit der Dokumentation:

https://github.com/ioBroker/ioBroker.javascript/blob/5c5cecafb52b536c29e815db2f7ef5209b781351/docs/en/javascript.md?plain=1#L1363-L1395

klein0r commented 5 months ago

Deswegen generiert der Blockly-Code für den Selektor auch folgendes JS:

Array.prototype.slice.apply($('channel[state.id=*]'));
paul53 commented 5 months ago

Ja, Blockly liefert das korrekte Array. Auch die each-Schleife funktioniert richtig. Das Objekt ist trotzdem nicht "sauber", was es in Vorgängerversionen war. Siehe auch im Forum.

klein0r commented 5 months ago

Das Objekt ist trotzdem nicht "sauber", was es in Vorgängerversionen war

Seit wann ist es denn anders und wie genau sah es vorher aus? Eigentlich hat sich an dem Selektor seit Ewigkeiten nichts geändert.

paul53 commented 5 months ago

Seit welcher Version, kann ich nicht genau sagen, aber der Fehler kann noch nicht lange exisitieren. Vorher hat das Objekt mit {... ,length: N} geendet. Alles was danach kommt, gehört dort nicht rein: , each: [Function (anonymous)], getState: [Function (anonymous)], getStateAsync: [AsyncFunction (anonymous)], getBinaryState: [Function (anonymous)], getBinaryStateAsync: [Function (anonymous)], setState: [Function (anonymous)], setStateAsync: [AsyncFunction (anonymous)], setStateDelayed: [Function (anonymous)], setBinaryState: [Function (anonymous)], setBinaryStateAsync: [AsyncFunction (anonymous)], on: [Function (anonymous)], [Symbol(Symbol.iterator)]: [GeneratorFunction (anonymous)] }

klein0r commented 5 months ago

Alles was danach kommt, gehört dort nicht rein:

Doch, sonst könnte man auf dem Ergebnis ja die Funktionen (siehe Doku) nicht aufrufen. Die müssen ja auf dem Objekt deklariert sein. Und das ist schon seit über 6 Jahren so wenn man in die git history schaut.

z.B. 0534e3692b1bdffc1890af0fa4a39e1fbedd2562

paul53 commented 5 months ago

Wenn sich laut Forum nur die Log-Ausgabe von Objekten geändert hat, dann hat sich das Issue erledigt.

klein0r commented 5 months ago

Grund dafür war übrigens #1289 - 1e48087904e7859884b7d22d32560bf4efa72c6e