使用 setTimeout 延遲執行函數呼叫
在 JavaScript 中,使用 setTimeout() 安排稍後執行函數是非同步程式設計的常用技術。但是,在某些情況下,儘管有延遲安排,但該函數仍會立即執行。了解 setTimeout() 的複雜性對於有效的非同步執行至關重要。
在提供的上下文中,crawl() 函數旨在以大約 10 秒的間隔呼叫 doRequest() 函數。然而,該函數是立即執行的。
理解這個問題的關鍵在於setTimeout()的語法。提供函數作為參數時,重要的是指定函數本身,然後是延遲,然後是函數所需的任何參數。
可能的解決方案:
功能、延遲和參數:
按以下方式呼叫setTimeout():
setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
這確保doRequest() 作為要執行的函數傳遞,以及延遲和必要的時間參數。
函數為字串:
或者,您可以將doRequest() 作為將要計算的字串傳遞:
setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);
此方法需要更少的括號,並提供更簡潔的替代方案。
匿名函數閉包:
將doRequest() 包含在匿名函數中,以防止循環內的參數變更:
(function(u, p, t) { setTimeout(function() { doRequest(u, p); }, t); })(url, proxys[proxy], proxytimeout);
此技術可確保閉包中使用的變數保持一致,即使隨著循環的進行。但是,它比前面的選項稍微複雜一些。
根據您的特定需求,這些解決方案中的任何一個都會有效地安排 doRequest() 的執行並達到預期的延遲。了解 setTimeout() 的細微差別對於 JavaScript 中成功的非同步程式設計至關重要。
以上是儘管設定了延遲,為什麼我的 setTimeout() 函數仍立即執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!