如何在JavaScript循環中實現延遲執行?
P粉680000555
2023-08-20 14:12:51
<p>我想在一個<code>while</code>循環中加入延遲/睡眠:</p>
<p>我試了以下的方法:</p>
<pre class="brush:php;toolbar:false;">alert('hi');
for(var start = 1; start < 10; start ) {
setTimeout(function () {
alert('hello');
}, 3000);
}</pre>
<p>只有第一種情況是正確的:在顯示<code>alert('hi')</code>後,它將等待3秒鐘,然後顯示<code>alert('hello' )</code>,但接下來<code>alert('hello')</code>將會不斷重複顯示。 </p>
<p>我希望的是,在顯示<code>alert('hello')</code>後的3秒鐘後,它需要再等待3秒鐘才能再次顯示<code>alert(' hello')</code>,以此類推。 </p>
自從ES7以後,有一個更好的方法可以等待循環:
當引擎到達
await
部分時,它設定一個逾時並暫停執行async函數
#。然後,當逾時完成時,執行在該點繼續。這非常有用,因為您可以延遲(1)巢狀循環,(2)有條件的,(3)巢狀函數:MDN上的參考資料
儘管ES7現在已經被NodeJS和現代瀏覽器支持,但您可能希望使用使用BabelJS進行轉譯,以便在任何地方運行。
setTimeout()
函數是非阻塞的,並且會立即傳回。因此,您的循環會非常快速地迭代,並且會在快速連續的情況下觸發3秒的超時。這就是為什麼您的第一個警報在3秒鐘後彈出,而其他所有警報都會連續跟隨而沒有任何延遲。您可能想使用類似以下的程式碼: