Ноябрь 3

Remove listener — NFC plugin

Проблема собственно в следующем, при активации сканера 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);
});