hat*_*hed 1 javascript settimeout
我正在尝试按秒总结元素数组。我的数组有 20 个元素,应该在 20 秒内汇总。
我setTimeout在for循环中使用但它不起作用,循环在第一秒之前完成。无论如何要实现?
for (var o = 0; o < 20; o++) {
setTimeout(function () {
tempPsum += array[o];
}, 1000);
}
Run Code Online (Sandbox Code Playgroud)
是的,循环在第一个setTimeout回调发生之前完成。您的代码安排了 20 个回调,这些回调都发生,一个接一个,一秒后。
你有两个选择:
安排每一个比前一个晚一秒,或
在上一个完成之前不要安排下一个
#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将你给它的第三个参数作为它的第一个参数传递给回调。
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |