【问题标题】:How does the callback function work with the set timeout function?回调函数如何与设置超时函数一起工作?
【发布时间】:2020-09-25 01:59:08
【问题描述】:
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 等待函数,如果callback(...) 没有返回一个新函数,你就不能这样做。但是你可以做setTimeout(callback, 2000) 然后callback 将在2 秒后被调用。欲了解更多信息,请阅读MDN

标签: javascript node.js callback settimeout


【解决方案1】:

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

setTimeout(callback, 2000);

但是,在这样做时,您放弃了对传递给回调的值的任何控制。因此,这仅在回调不需要任何数据时才有效。如果是这样,您将需要另一种方法。

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

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

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

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


实际上还有另一种选择,尽管这是特定于 setTimeout 的,并且不适用于许多其他使用回调的事情。 setTimeout 允许您将其他参数传递给 setTimeout,然后这些参数将传递给您的回调:

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

【讨论】:

    【解决方案2】:

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

    setTimeout(callback, 2000)
    

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

    setTimeout(callback(), 2000)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2013-11-06
      • 1970-01-01
      相关资源
      最近更新 更多