如何在JS中使用1秒延迟逐行进行循环日志

时间:2017-07-23 18:26:31

标签: javascript for-loop settimeout

我的代码将按照我想要的顺序记录所有10行(降序三角形),但我需要它在记录每个连续行之前延迟1秒。我尝试在for循环之前放置一个setTimeout,但这只是在同时打印所有10行之前造成了1秒的延迟。

function minusTen(num) {
  var arr = '';
  for (var i = num; i > 0; i--) {
    arr += '*';
  }

  var newArr = arr.split('');

  for (var j = num; j > 0; j--) {
    newArr.pop();
    console.log(newArr.join(' '));
  }
}

minusTen(10);

我可以使用jQuery,但是我希望尽可能避免实现Bootstrap。

谢谢!

6 个答案:

答案 0 :(得分:1)

您可以使用setTimeout,但是您必须将setTimeout保留在for循环中。如果num变为0,你也可以在这里使用setInterval并清除间隔:



function minusTen(num) {
  var arr = '';
  for (var i = num; i > 0; i--) {
arr += '*';
  }

  var newArr = arr.split('');
  var interval = setInterval(function(){
     newArr.pop();
     console.log(newArr.join(' '));
     num--;
     if(!num)
        clearInterval(interval);
  }, 1000)
}

minusTen(10);




答案 1 :(得分:0)

您可以使用某项功能。检查.length的{​​{1}},如果大于newArr,请再次拨打电话



0




答案 2 :(得分:0)

void rgb(int rgbA, int rgbB) {
    int ra = (rgbA&0xf800)>>11;
    int ga = (rgbA&0x7e0)>>5;
    int ba = rgbA&0x1f;
    int rb = (rgbB&0xf800)>>11;
    int gb = (rgbB&0x7e0)>>5;
    int bb = rgbB&0x1f;

    for (int i=0; i<16; i++) {
        int r = (ra*(15-i) + rb*i + 7)/15; // + 7 is there to apply rounding
        int g = (ga*(15-i) + gb*i + 7)/15;
        int b = (ba*(15-i) + bb*i + 7)/15;

        int result = r<<11|g<<5|b;

        printf("%04x\n", result);
    }
}

答案 3 :(得分:0)

如果您想减少代码占用空间,可以执行以下操作:

const printStars = (n) => {

  // Make sure we don't try to print zero stars
  if (n > 0) {

    // Fill an array with n stars
    const arr = Array(n).fill('*').join(' ');
    console.log(arr);

    // After a second, reduce n by 1 and call
    // the function again
    setTimeout(() => printStars(--n), 1000);
  }
}

printStars(10);

DEMO

值得指出的是,IE / Opera不支持Array.fill

如果您需要支持,请在示例中使用for/loop。在这里,我将该代码分离为自己的函数。

const getStars = (n) => {
  let arr = [];
  for (let i = 0; i < n; i++) {
    arr.push('*');
  }
  return arr.join(' ');
}

const printStars = (n) => {
  if (n > 0) {
    console.log(getStars(n));
    setTimeout(() => printStars(--n), 1000);
  }
}

DEMO 2

答案 4 :(得分:0)

您可以将setTimeout与偏移量一起使用。只需将所需的参数添加到日志功能中即可。

function log(offSet) {
  setTimeout(() => {
    const str = new Array(offSet + 1).join('*');
    console.log(str);
  }, 1000 * offSet);
}

for(let i = 1; i < 11; i ++) {
  log(i);
}

https://jsfiddle.net/ycreaL9w/

答案 5 :(得分:0)

使用async / await可以直截了当。 delay在指定的时间内执行代码。

async function minusTen(num) {
  var arr = '';
  for (var i = num; i > 0; i--) {
    arr += '*';
  }

  var newArr = arr.split('');

  for (var j = num; j > 0; j--) {
    newArr.pop();
    await delay(1000)
    console.log(newArr.join(' '));
  }
}

function delay(time) {
  return new Promise((resolve) => setTimeout(resolve, time))
}

minusTen(10);