Проблема собственно в следующем, при активации сканера NFC вешается событие на считывание метки, и в примерах я не нашел как его приостановить или изменить полезно когда есть несколько типов считывания, да и просто если нужно приостановить работу сканера
например в примере
scanButton.addEventListener("click", async () => {
log("User clicked scan button");
try {
const ndef = new NDEFReader();
await ndef.scan();
log("> Scan started");
ndef.addEventListener("readingerror", () => {
log("Argh! Cannot read data from the NFC tag. Try another one?");
});
ndef.addEventListener("reading", ({ message, serialNumber }) => {
log(`> Serial Number: ${serialNumber}`);
log(`> Records: (${message.records.length})`);
});
} catch (error) {
log("Argh! " + error);
}
});
writeButton.addEventListener("click", async () => {
log("User clicked write button");
try {
const ndef = new NDEFReader();
await ndef.write("Hello world!");
log("> Message written");
} catch (error) {
log("Argh! " + error);
}
});
при повторном (n) срабатывание тригера scanButton сканер будет дублировать (n) раз
log(`> Serial Number: ${serialNumber}`);
log(`> Serial Number: ${serialNumber}`); //* n
и чтоб от этого избавится, нужно вынести активацию сканера из подписчика клика
let ndef = new NDEFReader();
async function initNFC(){
try {
await ndef.scan();
} catch (error) {
curlog("Argh! " + error);
}
}
initNFC();
scanButton.addEventListener("click", async () => {
log("User clicked scan button");
try {
const ndef = new NDEFReader();
await ndef.scan();
log("> Scan started");
ndef.addEventListener("readingerror", () => {
log("Argh! Cannot read data from the NFC tag. Try another one?");
});
ndef.addEventListener("reading", ({ message, serialNumber }) => {
log(`> Serial Number: ${serialNumber}`);
log(`> Records: (${message.records.length})`);
});
} catch (error) {
log("Argh! " + error);
}
});
далее выносим безымянную функцию
let ndef = new NDEFReader();
async function initNFC(){
try {
await ndef.scan();
} catch (error) {
curlog("Argh! " + error);
}
}
initNFC();
function readr({ message, serialNumber }){
log(`> Serial Number: ${serialNumber}`);
log(`> Records: (${message.records.length})`);
}
scanButton.addEventListener("click", async () => {
log("User clicked scan button");
ndef.addEventListener("readingerror", () => {
log("Argh! Cannot read data from the NFC tag. Try another one?");
});
ndef.addEventListener("reading", readr ({ message, serialNumber }) => {
log(`> Serial Number: ${serialNumber}`);
log(`> Records: (${message.records.length})`);
},true);
});
что позволяет нам отключить функцию readr при необходимости
let ndef = new NDEFReader();
async function initNFC(){
try {
await ndef.scan();
} catch (error) {
curlog("Argh! " + error);
}
}
initNFC();
function readr({ message, serialNumber }){
log(`> Serial Number: ${serialNumber}`);
log(`> Records: (${message.records.length})`);
}
scanButton.addEventListener("click", async () => {
log("User clicked scan button");
ndef.addEventListener("readingerror", () => {
log("Argh! Cannot read data from the NFC tag. Try another one?");
});
ndef.addEventListener("reading", readr, true);
});
disableScanButton.addEventListener("click", () => {
ndef.removeEventListener("reading", readr, false);
});