簡體   English   中英

Node.js中的setTimeout細微差別

[英]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提供了具有正確語法的有效函數,但在函數中有參數時為什么它不起作用?

通過在函數名稱后面加上括號,可以有效地調用它,而不會將函數作為回調傳遞。

為要調用的函數提供參數:

  1. 您可以傳遞anon函數。 setTimeout(function(){goodbye(name)}, 5000);
  2. 或者,您可以將參數作為第三個參數傳遞。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM