javascript - for循环-计数,等待计数器,继续计数

标签 javascript

for循环是遍历所有元素,然后调用另一个函数。

示例: for 循环应该调用该函数 5 次,然后等待 20 秒,然后调用接下来的 5 个元素。直到所有元素都被调用一次。在这 20 秒内,计数器应显示在处理接下来的 5 个元素之前还剩多少秒。

function myCounter(counter) {
  var interval = setInterval(function() {
      counter--;
    sec = Math.floor(counter % 60);  
    min = Math.floor(counter/60);

    sec = (sec < 10)?'0'+sec:sec;
    min = (min < 10)?'0'+min:min;

      $('#counter').html(min+':'+sec);
      if (counter == 0) {
          clearInterval(interval);
          return counter;
      }
  }, 1000);
}

var x = 1;
for (i=0; i<=50; i++){

  // if x < 5 then the next 5 elements
  // call the external function
  $('.check').html(i);

	//if x > 4 show the counter and wait to 0
  if(x > 5){
    myCounter(20);
    x=0;
  }
  x++;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<p id="counter"></p>
<p id="msg">Mache was <span class="check"></span></p>

最佳答案

您可以通过 Promise 使用类似下面的示例。

const sleep = (elements, sleepTime, callback) => {
  let secs = sleepTime / 1000;
  let i = 0;
  let counter = 5;
  let elms = elements.splice(0, counter);
  if (elms.length <= 5) {
    counter = elms.length;
  }
  return new Promise((resolve) => {
    while (i < counter) {
      if (elms[i] !== undefined) {
        console.log("this is element: " + elms[i]);
      }
      i++;
      if (i == counter) {
        let logger = setInterval(() => {
          console.log("waiting for " + secs + " seconds");
          secs--;
          if (secs == 0) {
            clearInterval(logger);
            if (elements.length == 0) {
              if(typeof callback == "function") {
                  callback();
              } 
              resolve(true);
            } else {
              sleep(elements, sleepTime, callback);
            }
          }
        }, 1000);
      }
    }
  });
}

用法

const chel = [...]; // your elements are here
const onFinish = () => {
    alert("...finished!");
}
alert("Starting...!");
sleep(chel, 20000, onFinish); // or sleep(chel, 20000);

您可以通过运行下面的代码片段来试试这个(sleepTime 设置为 5 秒)

const sleep = (elements, sleepTime, callback) => {
  let secs = sleepTime / 1000;
  let i = 0;
  let counter = 5;
  let elms = elements.splice(0, counter);
  if (elms.length <= 5) {
    counter = elms.length;
  }
  return new Promise((resolve) => {
    while (i < counter) {
      if (elms[i] !== undefined) {
        console.log("this is element: " + elms[i]);
      }
      i++;
      if (i == counter) {
        let logger = setInterval(() => {
          console.log("waiting for " + secs + " seconds");
          secs--;
          if (secs == 0) {
            clearInterval(logger);
            if (elements.length == 0) {
              if (typeof callback == "function") {
                callback();
              }
              resolve(true);
            } else {
              sleep(elements, sleepTime, callback);
            }
          }
        }, 1000);
      }
    }
  });
}
const chel = ["H - Hydrogen", "He - Helium", "Li - Lithium", "Be - Beryllium", "B - Boron", "C - Carbon", "N - Nitrogen", "O - Oxygen", "F - Fluorine", "Ne - Neon", "Na - Sodium", "Mg - Magnesium", "Al - Aluminium", "Si - Silicon", "P - Phosphorus", "S - Sulfur", "Cl - Chlorine", "Ar - Argon", "K - Potassium", "Ca - Calcium", "Sc - Scandium", "Ti - Titanium", "V - Vanadium", "Cr - Chromium", "Mn - Manganese", "Fe - Iron", "Co - Cobalt", "Ni - Nickel", "Cu - Copper", "Zn - Zinc", "Ga - Gallium", "Ge - Germanium", "As - Arsenic", "Se - Selenium", "Br - Bromine", "Kr - Krypton", "Rb - Rubidium", "Sr - Strontium", "Y - Yttrium", "Zr - Zirconium", "Nb - Niobium", "Mo - Molybdenum", "Tc - Technetium", "Ru - Ruthenium", "Rh - Rhodium", "Pd - Palladium", "Ag - Silver", "Cd - Cadmium", "In - Indium", "Sn - Tin", "Sb - Antimony", "Te - Tellurium", "I - Iodine", "Xe - Xenon", "Cs - Caesium", "Ba - Barium", "La - Lanthanum", "Ce - Cerium", "Pr - Praseodymium", "Nd - Neodymium", "Pm - Promethium", "Sm - Samarium", "Eu - Europium", "Gd - Gadolinium", "Tb - Terbium", "Dy - Dysprosium", "Ho - Holmium", "Er - Erbium", "Tm - Thulium", "Yb - Ytterbium", "Lu - Lutetium", "Hf - Hafnium", "Ta - Tantalum", "W - Tungsten", "Re - Rhenium", "Os - Osmium", "Ir - Iridium", "Pt - Platinum", "Au - Gold", "Hg - Mercury", "Tl - Thallium", "Pb - Lead", "Bi - Bismuth", "Po - Polonium", "At - Astatine", "Rn - Radon", "Fr - Francium", "Ra - Radium", "Ac - Actinium", "Th - Thorium", "Pa - Protactinium", "U - Uranium", "Np - Neptunium", "Pu - Plutonium", "Am - Americium", "Cm - Curium", "Bk - Berkelium", "Cf - Californium", "Es - Einsteinium", "Fm - Fermium", "Md - Mendelevium", "No - Nobelium", "Lr - Lawrencium", "Rf - Rutherfordium", "Db - Dubnium", "Sg - Seaborgium", "Bh - Bohrium", "Hs - Hassium", "Mt - Meitnerium", "Ds - Darmstadtium", "Rg - Roentgenium", "Cn - Copernicium", "Nh - Nihonium", "Fl - Flerovium", "Mc - Moscovium", "Lv - Livermorium", "Ts - Tennessine", "Og - Oganesson"];


const onFinish = () => {
  alert("...finished!");
}
alert("Starting...!");
sleep(chel, 5000, onFinish);

关于javascript - for循环-计数,等待计数器,继续计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59470864/

相关文章:

javascript - 为什么 fetch() 使用 ReadableStream 作为响应正文?

javascript - Javascript 中的 gluProject 等效项

javascript - 如何使用 Promise 来解决这个问题?

javascript - 在 SCSS 中动态堆叠图像

javascript - 无法从 React 前端向 Node.js 后端发送 POST 请求

javascript - WebRTC 仅接收视频,不带 TURN

javascript - 获取所有非唯一值(即 : duplicate/more than one occurrence) in an array

javascript - 通过 ajax 发送多个对象(使用 Angular )

javascript - 将大型 node.js 应用程序捆绑到单个 .js 文件中

javascript - 如何从对象映射渲染 React.js 中的元素