[英]setTimeout nuances in Node.js
我試圖了解setTimeout函數中回調函數的工作方式。 我知道格式是: setTimeout(callback, delay)
我寫了一些測試腳本來探索這一點。
test1.js
console.log("Hello")
setTimeout(function () { console.log("Goodbye!") }, 5000)
console.log("Non-blocking")
這將按預期工作,打印Hello <CRLF> Non-blocking
,然后5秒鍾后打印Goodbye!
然后,我想將函數帶到setTimeout之外,如下所示:
console.log("Hello")
setTimeout(goodbye(), 5000)
console.log("Non-blocking")
function goodbye () {
console.log("Goodbye")
}
但它不起作用,並且“ Non-blocking
和“ Goodbye!
之間沒有5秒的延遲Goodbye!
,它們彼此直接打印。
如果我在超時中從函數調用中刪除了括號,它會起作用,如下所示:
setTimeout(goodbye, 5000)
但這對我來說沒有意義,因為那不是您調用函數的方式。 此外,如果它看起來像這樣,如何將參數傳遞給該函數?
var name = "Adam"
console.log("Hello")
setTimeout(goodbye(name), 5000)
console.log("Non-blocking")
function goodbye (name) {
console.log("Goodbye "+name)
}
我的問題確實是,盡管setTimeout提供了具有正確語法的有效函數,但在函數中有參數時為什么它不起作用?
通過在函數名稱后面加上括號,可以有效地調用它,而不會將函數作為回調傳遞。
為要調用的函數提供參數:
setTimeout(function(){goodbye(name)}, 5000);
setTimeout(goodbye, 5000, name);
看一下這個問題: 如何將參數傳遞給setTimeout()回調?
無論放置在何處, goodbye(name)
將立即執行該功能。 因此,您應該將函數本身傳遞給setTimeout()
: setTimeout(goodbye, 5000, name)
。
當您像這樣使用它時:
setTimeout(goodbye(), 5000);
它將首先調用goodbye
以獲得其返回值,然后將使用返回的值調用setTimeout
。
您應該使用對回調函數的引用來調用setTimeout
,即僅指定函數的名稱,以便獲得其引用而不是調用它:
setTimeout(goodbye, 5000);
要在向回調函數發送參數時引用函數,可以將其包裝在函數表達式中:
setTimeout(function() { goodbye(name); }, 5000);
您可以在調用中使用括號,但是該函數應返回對實際回調函數的函數引用:
setTimeout(createCallback(), 5000);
function createCallback() {
return function() {
console.log("Goodbye");
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.