首頁 >web前端 >js教程 >儘管設定了延遲,為什麼我的 setTimeout() 函數仍立即執行?

儘管設定了延遲,為什麼我的 setTimeout() 函數仍立即執行?

Barbara Streisand
Barbara Streisand原創
2024-11-14 18:33:01538瀏覽

Why is my setTimeout() function executing immediately, despite setting a delay?

使用 setTimeout 延遲執行函數呼叫

在 JavaScript 中,使用 setTimeout() 安排稍後執行函數是非同步程式設計的常用技術。但是,在某些情況下,儘管有延遲安排,但該函數仍會立即執行。了解 setTimeout() 的複雜性對於有效的非同步執行至關重要。

在提供的上下文中,crawl() 函數旨在以大約 10 秒的間隔呼叫 doRequest() 函數。然而,該函數是立即執行的。

理解這個問題的關鍵在於setTimeout()的語法。提供函數作為參數時,重要的是指定函數本身,然後是延遲,然後是函數所需的任何參數。

可能的解決方案:

  1. 功能、延遲和參數:

    按以下方式呼叫setTimeout():

    setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

    這確保doRequest() 作為要執行的函數傳遞,以及延遲和必要的時間參數。

  2. 函數為字串:

    或者,您可以將doRequest() 作為將要計算的字串傳遞:

    setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);

    此方法需要更少的括號,並提供更簡潔的替代方案。

  3. 匿名函數閉包:

    將doRequest() 包含在匿名函數中,以防止循環內的參數變更:

    (function(u, p, t) {
       setTimeout(function() { doRequest(u, p); }, t);
    })(url, proxys[proxy], proxytimeout);

    此技術可確保閉包中使用的變數保持一致,即使隨著循環的進行。但是,它比前面的選項稍微複雜一些。

根據您的特定需求,這些解決方案中的任何一個都會有效地安排 doRequest() 的執行並達到預期的延遲。了解 setTimeout() 的細微差別對於 JavaScript 中成功的非同步程式設計至關重要。

以上是儘管設定了延遲,為什麼我的 setTimeout() 函數仍立即執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn