Как остановить функцию в JavaScript в функции синхронизации?

#javascript #timeout #jspdf

#javascript #тайм-аут #jspdf

Вопрос:

Все это я использую этот код для печати pdf в альбомном режиме, распечатывая два набора данных с каждой стороны, эта штука работает отлично, но теперь я подумываю об использовании кнопки остановки, которая может остановить этот процесс.

Я застрял на этом, поэтому, пожалуйста, дайте несколько предложений по этому поводу.

Заранее спасибо, и я впервые публикую вопрос на этой платформе.

 function timer(ms) {
                return new Promise(res => setTimeout(res, ms));
            }

            async function load() { // wrap the loop into an async function for this to work
                for (i = 0; i < sCustID.length; i  ) {
                    var elem = document.getElementById("myBar");
                    document.getElementById("pdfhead").innerHTML = qrtype;
                    document.getElementById("QRCODEID").innerHTML = sCustID[i];
                    document.getElementById("NAME").innerHTML = sName[i];
                    qrinput[i] = sCustID[i]   ","   sName[i]   ","   sType[i];
                    generateQRCode(qrinput[i]);
                    document.getElementById("printed").innerHTML = i;
                    document.getElementById("pdfhead2").innerHTML = qrtype;
                    document.getElementById("QRCODEID2").innerHTML = sCustID[i   1];
                    document.getElementById("NAME2").innerHTML = sName[i 1];
                    qrinput[i 1] = sCustID[i 1]   ","   sName[i 1]   ","   sType[i 1];
                    generateSecQRCode(qrinput[i   1]);
                    document.getElementById("printed").innerHTML = i   1;
                    PdfFDesignModal.style.display = "block";
                    TimerModal1.style.display = "block";
                    width = ((i 1) * 100) / totalprint1;
                    elem.style.width = width   '%';
                    i = i   1;
                    savePdf(sCustID[i   1]);
                    if (i  == sCustID.length) {
                        alert("All QRCODE Printed");
                        PdfFDesignModal.style.display = "none";
                        TimerModal1.style.display = "none";
                    }
                    await timer(1500); // then the created Promise can be awaited
                }
            }
            load();

        }
  

Ответ №1:

Настройте кнопку с прослушивателем, который вызывает функцию для установки глобальной переменной. Затем протестируйте эту переменную как часть условного теста в цикле for .

Это будет работать из-за асинхронной природы цикла for . Вызов stopPrint() будет иметь возможность прервать процесс

 let stop = false;
document.getElementById('stop').addEventListener('click', stopPrint);

function timer(ms) {
  return new Promise(res => setTimeout(res, ms));
}

async function load() { 
  for (i = 0; i < 10 amp;amp; !stop; i  ) {
    // do PDF work here
    console.log(i);
    await timer(1500); 
  }
}
load();

function stopPrint(){
  stop = true;
}    
 <button id='stop'>Stop</button>  

Ответ №2:

При использовании пользовательского класса promise код может выглядеть как эта живая демонстрация

 import CPromise from "c-promise2";

async function yourAsyncTask(i) {
  //some async code here
  console.log(`Task [${i}]`);
  return 123;
}

function load() {
  return CPromise.from(function* () {
    this.innerWeight(20); // for progress capturing, can be omitted
    for (let i = 0; i < 10; i  ) {
      yield yourAsyncTask(i); //use yield with promises instead of await here
      yield CPromise.delay(1000); // I don't know why you need a delay
    }
  });
}

const cancelablePromise = load()
  .progress((value) => console.log(`Progress: ${value * 100}%`)) // just for fun let's capture progress
  .then(
    () => console.log("Done"),
    (err) => console.log(`Fail: ${err}`)
  );

setTimeout(() => {
  cancelablePromise.cancel(); // abort async sequence
}, 3500);
  

Вывод на консоль:

 Task [0] 
Progress: 5%
Progress: 10%
Task [1] 
Progress: 15%
Progress: 20%
Task [2] 
Progress: 25%
Progress: 30%
Task [3] 
Progress: 35%
Fail: CanceledError: canceled