由于我无法发表评论,因此我不得不撰写这篇文章。我得到下面的代码,它延迟/恰好延迟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秒。
虽然可以用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)
这是一个将立即显示的函数,然后是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)
花了我一些时间来解释您的问题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)
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |