javascript sleep 函数通过 Promise 循环

2023-12-04

我打算在 Firefox 中打开一系列网址,每个网址应在 10 分钟内打开一个又一个,这是我的代码应在 Firebug 控制台中执行:

function sleep (time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}
var urls = ["https://www.google.com/","https://www.bing.com/","https://www.reddit.com/"];
for(var i = 0; i < urls.length; i++)
    sleep(600000 * i).then(() => {
    window.open(urls[i]); 
})

但它不起作用,有人可以帮助我吗?谢谢~


Sleep函数正在执行异步地for循环在执行任何一个之前完成sleep calls.

所以,最后的值for循环将是3, and window.open函数将接收作为参数value of urls[3]这是未定义的。

看一看:

function sleep (time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}
var urls = ["https://www.google.com/","https://www.bing.com/","https://www.reddit.com/"];
for(var i = 0; i < urls.length; i++)
    sleep(600*i).then(() => {
    console.log(i); 
})

一种解决方案是使用let关键词。

你应该使用let关键字以便使用enclosed的价值i多变的。

function sleep (time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}
var urls = ["https://www.google.com/","https://www.bing.com/","https://www.reddit.com/"];
for(let i = 0; i < urls.length; i++)
    sleep(6000*i).then(() => {
    window.open(urls[i]); 
})

jsFiddle 解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript sleep 函数通过 Promise 循环 的相关文章