NDEFReader.запись, игнорирующая сигнал прерывания

#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. подойдите к тегу.

тег теперь содержит строку «некоторые данные» там, где она не должна

Ответ №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();
};