繁体   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