Signatur
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
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();
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);
// 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. hasReadingist nichtactivated: Ein aktivierter Sensor kann noch ohne Messwert sein. Wer nuractivatedprüft, riskiertnull-Werte und damitTypeErrors, z. B. beix.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. AmbientLightSensorist 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.