如何根据索引/迭代次数动态更改For循环中的间隔时间?

Mik*_*ike 12 javascript wait

由于我无法发表评论,因此我不得不撰写这篇文章。我得到下面的代码,它延迟/恰好延迟1秒或1000毫秒-

let n = 5;
for (let i=1; i<n; i++)
{
  setTimeout( function timer()
  {
      console.log("hello world");
  }, i*1000 );
}
Run Code Online (Sandbox Code Playgroud)

但是,如何将其延迟* 1000秒而不是固定的1000毫秒,所以等待取决于迭代次数?

例如,如果n = 5,那么我希望在第一次迭代中将循环延迟设为1秒。在第二次迭代中2秒,依此类推...最终延迟将为5秒。

mbo*_*jko 8

虽然可以用promises,反应流和其他很酷的工具解决这个任务(嘿,还没有人建议使用worker!),但是也可以用一些算法解决。

因此,您需要按以下顺序超时:1s,前一个+ 2s,前一个+ 3s,依此类推。该序列为:1、3、6、10、15 ...,其公式为a[n] = n * (n + 1) / 2。知道...

let n = 6;
console.log(new Date().getSeconds());

for (let i = 1; i < n; i++) {
  setTimeout(function timer() {
    console.log(new Date().getSeconds());
  }, 1000 * i * (i + 1) / 2);
}
Run Code Online (Sandbox Code Playgroud)


mpl*_*jan 6

这是一个将立即显示的函数,然后是1秒钟,然后是2秒钟,之后是3秒钟,依此类推。无需特殊数学,无需承诺

const n = 5;
let cnt=0;

function show() {
  console.log("call "+cnt,"delay: ",cnt,"sec");
  cnt++;
  if (cnt > n) return; // we are done
  setTimeout(show, cnt*1000 ); // cnt seconds later
}
show()
Run Code Online (Sandbox Code Playgroud)


pav*_*ipo 5

花了我一些时间来解释您的问题xD,但这是您想要的吗?

这将每次以i * 1000的延迟触发console.log。因此,第一次将是1秒长(1 * 1000),然后将是2秒,依此类推。

let i = 0;
loop = () => {
  setTimeout(() => {
    console.log(new Date()); // for clarity
    i++;
    if (i < 10) {
      loop();
    }
  }, i * 1000)
};
loop();
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以尝试使用async / await(承诺)序列化代码:

const waitSeconds = seconds => new Promise(resolve => setTimeout(resolve, seconds))

async function main () {
 let oldDate = new Date()
 let newDate
 
 /* 
  * If you put 'await' inside the loop you can synchronize the async code, and simulate
  * a sleep function
  */
 for (let i=1; i<5; i++) {
    await waitSeconds(i*1000)
    newDate = new Date()   
    console.log(`Loop for i=${i}, elapsed=${moment(newDate).diff(oldDate, 'seconds')} seconds`)
    oldDate = newDate
 }
 
 console.log('End')
}

main()
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)