2017-08-11 56 views
1

我打算開一個系列在Firefox的URL,每一個都應該陸續在10分鐘內開了,這裏是我的代碼應該在Firebug的控制檯來執行:JavaScript的睡眠功能由無極環

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]); 
}) 

但它不起作用,有人能幫助我嗎?謝謝〜

+0

看一個例子:https://stackoverflow.com/q/750486/5647260 – Li357

回答

3

Sleep功能執行異步for循環執行任何sleep調用之前完成。

所以,for循環的最後一個值將是3,並window.open函數將收到的參數urls[3]這是不確定的value

看一看:

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關鍵字。

你應該爲了使用i變量的封閉值使用let關鍵字。

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 solution.

+0

感謝亞歷克斯,它的工作原理。我發現javascript更困難。謝謝bro〜 – Wang

+0

@Wang,不客氣。不要忘記接受答案,以幫助其他人。 –

0

的問題是,我將= 3在所有3例,所以你需要節省I例如

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

但即使這樣也無濟於事,因爲第一個新標籤將打開,您的激活代碼標籤將被瀏覽器停止。

0

想想間隔+ entries會更適合這個,這裏是ES6

const urls = [ 
    'https://www.google.com/', 
    'https://www.bing.com/', 
    'https://www.reddit.com' 
] 

const entries = urls.entries() 

const loop = setInterval(() => { 
    const {value, done} = entries.next() 
    done ? clearInterval(loop) : open(value) 
}, 600 * 10)