#javascript #google-chrome #webnfc
Вопрос:
Я пытаюсь создать простую веб-страницу, которая может читать и записывать теги NFC. Я также хотел бы иметь возможность отменить операцию записи, если это необходимо. поэтому я следовал примерам здесь и здесь. однако я столкнулся с проблемой, когда сигнал прерывания игнорируется. этот простой код может продемонстрировать проблему:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
<script>
let data;
let reset_controller = new AbortController();
let ndef;
try {
ndef = new window.NDEFReader();
ndef.addEventListener("readingerror", async () => {
log_error('Cannot read data from the NFC tag.');
});
ndef.addEventListener("reading", async ({message, serialNumber}) => {
data = new TextDecoder('utf-8').decode(message.records[0].data.buffer);
draw_info();
});
} catch (error) {
console.error(error);
}
function draw_info() {
document.getElementById('data').innerHTML = `data is: ${data}`;
}
function reset() {
console.log('Aborted!')
reset_controller.abort();
document.getElementById('data').innerHTML = '';
}
async function read_data() {
data = await ndef.scan();
draw_info();
}
async function write_data() {
console.log('stating write')
try {
await ndef.write("some data", {
AbortSignal: reset_controller.signal
});
} catch (e) {
console.error(e);
}
}
</script>
</head>
<body>
<button onclick="read_data()">Read</button>
<button onclick="write_data()">Write</button>
<button onclick="reset()">Rest</button>
<p id="data">data is: </p>
</body>
</html>
чтобы повторить проблему:
1 — нажмите на кнопку записи.
2 — нажмите кнопку сброс, чтобы отменить запись.
- подойдите к тегу.
тег теперь содержит строку «некоторые данные» там, где она не должна
Ответ №1:
хорошо, я нашел проблему.
когда мы передаем объект options функции записи, сигнал прерывания должен быть помещен в атрибут «сигнал», а не в «сигнал прерывания».
Ответ №2:
Действительно. Ключом для словаря опций должен быть signal
, но не AbortSignal
. См. Примеры кода на https://web.dev/nfc/#abort-nfc-operations
const abortController = new AbortController();
abortController.signal.onabort = event => {
// All NFC operations have been aborted.
};
const ndef = new NDEFReader();
await ndef.scan({ signal: abortController.signal });
await ndef.write("Hello world", { signal: abortController.signal });
document.querySelector("#abortButton").onclick = event => {
abortController.abort();
};