Ser*_*tes 4 javascript asynchronous settimeout node.js
在这里,我试图为每次迭代设置超时但我无法做到因为nodejs的性质.有没有办法做到这一点?
提前致谢
for (var i = 1; i <= 1000; i++) {
setTimeout(function () { console.log('something') }, 3000);
}Run Code Online (Sandbox Code Playgroud)
它可以工作,但它同时安排所有超时.
如果您想以3秒的间隔安排它们,请使用:
for (var i = 1; i <= 1000; i++) {
setTimeout(function () { console.log('something') }, i * 3000);
}
Run Code Online (Sandbox Code Playgroud)
如果你想i在你的超时回调中使用,请使用let而不是var这样:
for (let i = 1; i <= 1000; i++) {
setTimeout(function () { console.log('something', i) }, i * 3000);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,var它会为每一行打印1001:
for (var i = 1; i <= 1000; i++) {
setTimeout(function () { console.log('something', i) }, i * 3000);
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以使用箭头函数语法简化它:
for (let i = 1; i <= 1000; i++) {
setTimeout(() => console.log('something', i), i * 3000);
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是做这样的事情 - 而不是同时安排所有1000个超时,创建一个间隔:
(() => {
let i = 0;
setInterval(() => {
i++;
console.log('something', i);
}, 3000);
})();
Run Code Online (Sandbox Code Playgroud)
外部闭包是为了防止i变量在外部范围内可见.或者你可以使用这样的东西:
(() => {
let i = 0;
let f = () => {
i++;
console.log('something', i);
setTimeout(f, 3000);
};
setTimeout(f, 3000);
})();
Run Code Online (Sandbox Code Playgroud)
在最后一个示例中,作为超时回调调用的函数每次完成时都会自行调度.
有很多方法可以做到这一点,并且都有一些优点和缺点.
例如,如果您的回调可能运行的时间超过调用之间的间隔,则不应使用setInterval.当你使用setTimeout并在每个回调中安排自己时,这不会是一个问题,但另一方面,你可能在这种间隔中的精度较低.您需要测试最适合您的方法.
| 归档时间: |
|
| 查看次数: |
980 次 |
| 最近记录: |