Start · Sprachen · JavaScript · Referenz · Sensor.hasReading

Sensor.hasReading

Eigenschaft

Die schreibgeschützte Eigenschaft <code>hasReading</code> gibt als booleschen Wert an, ob der Sensor bereits einen Messwert geliefert hat.

seit JavaScript Generic Sensor API — Chromium-Browser (Chrome/Edge Kategorie: webapi

Signatur

get Sensor.prototype.hasReading

Beschreibung

hasReading ist eine schreibgeschützte Eigenschaft des Basis-Interfaces Sensor aus der Generic Sensor API. Sie steht deshalb in allen abgeleiteten Sensoren zur Verfügung, zum Beispiel Accelerometer, Gyroscope, Magnetometer, AmbientLightSensor, AbsoluteOrientationSensor und RelativeOrientationSensor. Der Wert ist true, sobald nach start() mindestens ein Messwert eingetroffen ist. Vorher ist er false.

Nützlich ist die Eigenschaft vor allem, wenn du außerhalb des reading-Events auf Messwerte zugreifst, etwa in einer requestAnimationFrame-Schleife oder beim Abfragen in festen Zeitabständen. Solange hasReading false ist, haben Eigenschaften wie x, y, z, illuminance oder quaternion den Wert null, und timestamp ist ebenfalls null.

Nach stop() oder einem Fehler (error-Event) setzt der Browser die Messwerte zurück, und hasReading ist wieder false. Aus dem Wert kannst du also direkt ablesen, ob gerade gültige Daten vorliegen. Achtung: activated ist etwas anderes. Diese Eigenschaft sagt nur, dass der Sensor läuft, nicht, dass schon Daten da sind.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn ein aktueller Messwert vorliegt, sonst false: vor dem ersten Messwert, nach stop() und nach einem Fehler.

Beispiele

Zustand vor und nach dem ersten Messwert prüfen

const sensor = new Accelerometer({ frequency: 10 });

console.log('Vor start():', sensor.hasReading);

sensor.addEventListener('reading', () => {
  console.log('Im reading-Event:', sensor.hasReading, sensor.x);
}, { once: true });

sensor.addEventListener('error', (e) => console.error(e.error.name, e.error.message));
sensor.start();
Vor start(): false Im reading-Event: true 0.12

Sicheres Auslesen in einer requestAnimationFrame-Schleife

const gyro = new Gyroscope({ frequency: 60 });
gyro.start();

const loop = () => {
  if (gyro.hasReading) {
    // Nur dann sind x/y/z nicht null
    const { x, y, z } = gyro;
    document.querySelector('#out').textContent =
      `x=${x.toFixed(2)} y=${y.toFixed(2)} z=${z.toFixed(2)}`;
  }
  requestAnimationFrame(loop);
};
requestAnimationFrame(loop);

Auf den ersten Messwert warten (Promise-Helfer)

const firstReading = (sensor, timeoutMs = 3000) => new Promise((resolve, reject) => {
  if (sensor.hasReading) return resolve(sensor);
  const timer = setTimeout(() => reject(new Error('Kein Messwert erhalten')), timeoutMs);
  sensor.addEventListener('reading', () => { clearTimeout(timer); resolve(sensor); }, { once: true });
  sensor.addEventListener('error', (e) => { clearTimeout(timer); reject(e.error); }, { once: true });
  sensor.start();
});

const main = async () => {
  const { state } = await navigator.permissions.query({ name: 'ambient-light-sensor' });
  if (state === 'denied') return console.warn('Zugriff verweigert');
  const light = await firstReading(new AmbientLightSensor());
  console.log(`Helligkeit: ${light.illuminance} lx`);
  light.stop();
  console.log('Nach stop():', light.hasReading);
};
main().catch(console.error);
Helligkeit: 245 lx Nach stop(): false

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die Generic Sensor API gibt es praktisch nur in Chromium-basierten Browsern. Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher, ob die API vorhanden ist, z. B. mit 'Accelerometer' in window.
  • Nur in sicheren Kontexten: Die API funktioniert nur über HTTPS oder localhost. Außerdem kann eine Permissions Policy sie blockieren (z. B. accelerometer, gyroscope), etwa in iframes.
  • hasReading ist nicht activated: Ein aktivierter Sensor kann noch ohne Messwert sein. Wer nur activated prüft, riskiert null-Werte und damit TypeErrors, z. B. bei x.toFixed().
  • Zurücksetzen: Nach stop(), nach einem Fehler oder wenn der Tab im Hintergrund pausiert wird, gehen die Messwerte verloren. Speichere Werte selbst, wenn du sie länger brauchst.
  • AmbientLightSensor ist in Chrome standardmäßig nur mit einem Flag verfügbar.
  • Datenschutz: Sensordaten lassen sich für Fingerprinting nutzen. Browser senken deshalb teilweise die Frequenz oder runden die Messwerte.