我如何每秒求和数组元素

hat*_*hed 1 javascript settimeout

我正在尝试按秒总结元素数组。我的数组有 20 个元素,应该在 20 秒内汇总。

setTimeoutfor循环中使用但它不起作用,循环在第一秒之前完成。无论如何要实现?

for (var o = 0; o < 20; o++) {
   setTimeout(function () {
       tempPsum += array[o];
   }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

是的,循环在第一个setTimeout回调发生之前完成。您的代码安排了 20 个回调,这些回调都发生,一个接一个,一秒后。

你有两个选择:

  1. 安排每一个比前一个晚一秒,或

  2. 在上一个完成之前不要安排下一个

#1 更简单,所以让我们这样做:

for (let o = 0; o < 20; o++) {
//   ^^^???????????????????????????????
   setTimeout(function () {
       tempPsum += array[o];
   }, 1000 * o);
//        ^^^^??????????????????????????
}
Run Code Online (Sandbox Code Playgroud)

通过将延迟时间乘以o,我们得到0第一个计时器,1000第二个计时器,3000第三个计时器......

注意从var到的变化let。这样,o每次循环迭代都有一个单独的回调来关闭。(请参阅此处的答案,或...我的新书的第 2 章。:-))

如果您无法在您的环境中使用 ES2015+ 功能,您可以使用额外的参数来setTimeout代替:

for (var o = 0; o < 20; o++) {
   setTimeout(function (index) {
//                      ^^^^^???????????
       tempPsum += array[index];
//                       ^^^^^???????????
   }, 1000 * o, o);
//        ^^^^??^???????????????????????
}
Run Code Online (Sandbox Code Playgroud)

这告诉setTimeout将你给它的第三个参数作为它的第一个参数传递给回调。