【问题标题】:How to go through a queue with a loop, which includes a delay? (JavaScript)如何通过包含延迟的循环通过队列? (JavaScript)
【发布时间】:2023-04-04 17:18:01
【问题描述】:

我想将一些元素(在本例中为数字)添加到队列中,如果条件为真(在本例中为“反转”),那么我希望将数字反转然后添加到队列中。之后,我希望 start() 函数延迟 1 秒在控制台中打印数字。例如,示例代码的编号应打印为 1 秒后:“1”,2 秒后:“-2”,3 秒后:“-3”,当时间等于 queue.length 时,应该打印最后一个数字,所以在这种情况下它会4秒后成为“4”。谁能给我一个可以解决这个问题的功能?谢谢。

var queue = [];
var invert = false;

queue.push("1");
invert = true;
queue.push("2");
queue.push("3");
invert = false;
queue.push(4);

// queue should look like this
// queue = [ '1', '-2', '-3', '4' ]

var queueLenght = queue.length;
function start() {
        for(var i = 0; i < queueLenght; i++){
            console.log(queue.shift());
        }
}

start();

【问题讨论】:

    标签: javascript settimeout delay setinterval


    【解决方案1】:

    这就是你要找的吗?

    //generate queue
    var queue = [];
    var invert = false;
    
    function addNumber(n){
      queue.push(invert?-n:n);
    }
    
    addNumber('1');
    invert = true;
    addNumber('2');
    addNumber('3');
    invert = false;
    addNumber('4');
    
    //set interval
    var interval=setInterval(function(){
      if(queue.length){
        console.log(queue.shift());
      }
      else{
        clearInterval(interval);
      }
    },1000)

    这会正确生成队列,创建一个每 1000 毫秒执行一次代码的间隔,然后在完成后将其清除。

    【讨论】:

      【解决方案2】:

      您需要做两件事,首先让我们使用 数字反转,这可以通过覆盖 queuepush 方法来完成,如下所示:

      queue.push = function(data) {
        if (invert) data = data * -1
        return Array.prototype.push.call(this, data);
      }
      

      如果您将该代码添加到您的程序中,您将获得以下输出:

      1
      -2
      -3
      4

      【讨论】:

      • 以这种方式,如果您尝试打印queue 对象,它还将在其中定义push 函数。它会改变在其中循环的行为,例如,如果他只想保留其中的值
      【解决方案3】:

      您可以创建自己的推送函数并在其中使用数组。

      var queue = [];
      var invert = false;
      
      function myPush(value) {
        invert ? this.push(value * -1) : this.push(value);
      }
      
      Array.prototype.myPush = myPush;
      
      queue.myPush(1);
      invert = true;
      queue.myPush(2);
      queue.myPush(3);
      invert = false;
      queue.myPush(4);
      
      console.log(queue);

      将 invert 也作为参数传递会更好:

      var queue = [];
      
      function myPush(value, invert) {
        invert ? this.push(value * -1) : this.push(value);
      }
      
      Array.prototype.myPush = myPush;
      
      queue.myPush(1, false);
      queue.myPush(2, true);
      queue.myPush(3, true);
      queue.myPush(4, false);
      
      console.log(queue);

      【讨论】:

        猜你喜欢
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多