【问题标题】:Javascript delay inside a for loop with a array带有数组的for循环内的Javascript延迟
【发布时间】:2018-04-07 22:17:50
【问题描述】:

嘿,伙计们,我很难过我有这段代码。它从谷歌表格中获取一些数据并将其放入数组中。更具体地说,它获取地址和金额。它比在数组内创建一个小数组数组。然后我得到数组并循环遍历它,但我希望它在下一个数组之前暂停 10 秒。这就是我所拥有的:

                const randomArray = [];
                for (var i = 0; i < rows.length; ++i) {
                    let row = rows[i];
                    randomArray.push(row);
                }
     for (const data of randomArray) {
                    setTimeout(() => {
                        const AddressID = data[0];
                        const Amount = parseFloat(data[1]);
                        console.log(AddressID, Amount);
                    }, 5 * 1000);
                }
            }

总共有 4 个地址和 4 个金额。我需要它做(地址,金额)停止 10 秒,然后再做一次,直到它到达最后一个。我所做的等待 5 秒钟,然后一口气吐出所有 4 个地址和金额。

【问题讨论】:

标签: javascript arrays for-loop delay


【解决方案1】:
  • 使用setTimeout 而不是setInterval
  • 循环遍历数组并根据索引设置适当的间隔来等待回调的执行(即i * 10000而不是5 * 1000用于延迟,其中i是数组中的当前索引)
  • 使用Array#map 代替普通的for循环,因为当回调被执行时,循环将完成并且索引变量不会保持正确的值

演示

let randomArray = [[1,10], [2,20], [3,30], [4,40]];

randomArray.map((el,i) => {
  setTimeout(() => {
    const AddressID = el[0];
    const Amount = parseFloat(el[1]);
    console.log(AddressID, Amount);
  }, i * 10000);
});

另一种方法是使用递归函数,每次执行前一个回调时都会创建一个新的超时,直到你遍历数组

演示

let randomArray = [[1,10], [2,20], [3,30], [4,40]],
    i = 0;
    
(function loop() {
  setTimeout(() => {
    const AddressID = randomArray[i][0];
    const Amount = parseFloat(randomArray[i][1]);
    console.log(AddressID, Amount);
    i++;
    if(i < randomArray.length)
      loop();
  }, i * 10000);
})();

【讨论】:

  • 嘿,谢谢您的回复,我输入了错误的代码片段,我现在更改了它。我想告诉你我不能让行,因为一些表格文档有 100 多个地址和数量。这只是一个测试。
【解决方案2】:

关键是使用普通的for循环而不是offor循环这样就可以得到数组的索引:

const randomArray = [];
  for (var i = 0; i < rows.length; ++i) {
    let row = rows[i];
    randomArray.push(row);
  }
 for (var j = 0; j < randomArray.length; j++) {
        var data = [randomArray[j]];
    setTimeOut(() => { console.log("Delay")}, j * 5000);
    const AddressID = data[0];
    const Amount = parseFloat(data[1]);
    console.log(AddressID, Amount);
    }

这应该每五秒触发一次,只需将 5000 更改为您喜欢的任何值。

【讨论】:

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