回调函数如何与设置超时函数一起使用?

How does the callback function work with the set timeout function?

module.exports = (x, y , calllback) => {
    if (x <= 0 || y <= 0) {
        setTimeout(() => callback(new Error("Rectangle dimension should be greater than zero"), null), 
            2000);
    }
    else {
        setTimeout(() =>
            calllback(null, {
                perimeter: () => 2 * (x + y), 
                area: () => x * y
            }), 
            2000);
    }
}

我的问题是:为什么我必须在回调函数之前做 () => 因为 setTimeout 需要一个函数作为输入,所以为什么我不能直接做 setTimeout(callback(...), 2000 ). 可能是我对这个回调函数有一定的了解,如果有人能帮帮我就好了!

感谢您的每一条评论。

您需要将函数传递给 setTimeout,因此在某些情况下您可以这样做:

setTimeout(callback, 2000);

但是,在执行此操作时,您将放弃对将哪些值传递到回调中的任何控制。所以这只有在回调不需要任何数据时才有效。如果是这样,您将需要另一种方法。

执行以下操作不是一个选项:

setTimeout(callback(null, {
  perimeter: () => 2 * (x + y), 
  area: () => x * y
}), 2000);

它不是一个选项的原因是这段代码没有将函数传递给 setTimeout。相反,它会立即 调用回调,然后将其 return 值 传递给 setTimeout。

因此,执行此操作的方法是您展示的代码片段中的方法:创建一个新函数,该函数的主体调用回调并传入适当的值。我们将这个新函数传递给 setTimeout,然后 2 秒后它被调用,它转过来调用回调。


实际上还有一个选项,尽管它特定于 setTimeout,并且不适用于许多其他使用回调的东西。 setTimeout 允许您将其他参数传递给 setTimeout,然后这些参数将传递给您的回调:

setTimeout(
  callback,
  2000,
  null,
  {
    perimeter: () => 2 * (x + y), 
    area: () => x * y
  }
)

您应该能够向 setTimeout 函数发送回调。

setTimeout(callback, 2000)

但是你不能像这样调用函数

setTimeout(callback(), 2000)