为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

编程入门 行业动态 更新时间:2024-10-05 03:30:20

为什么这个 module.export <a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作"/>

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

我正在学习设置 Slack 机器人的教程,并尝试整理代码,通过将一些函数移动到其他文件来使其更具可读性。

在我尝试重新排列之前的初始状态是这样的:

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
})
await app.start()

然后我尝试将其重新排列为这样的内容:

app.js

const handleAppHomeOpened = require('./events/app_home_opened.js')
app.event('app_home_opened', handleAppHomeOpened)
await app.start()

事件/app_home_opened.js

async function handleEvent({event, client, context}) {
  // things happen
}
module.exports = handleEvent

当我在此版本中运行 app.js 时,出现错误

TypeError: app.event(...) is not a function
.


如果我按如下方式更新 app.js 那么它会正确执行:

const handleAppHomeOpened = require('./events/app_home_opened.js')
app.event('app_home_opened', async ({event, client, context})=>{
  handleAppHomeOpened({event, client, context})
})
await app.start()

有没有办法调整第二个,使其工作,而不是将函数调用包装在匿名函数中的额外步骤?

回答如下:

然后我尝试将其重新排列为像这样的东西

您发布的代码不会重现您声称的错误,我敢打赌您的实际代码是不同的。所以我会做一些侦探工作并做出预测。让我们首先分析您的错误:

> a = 1
1
> a()
Uncaught TypeError: a is not a function

错误是

a
不是一个函数。不完全是您的错误格式。这里数字 1 不是一个函数。到目前为止,一切都很好。但是让我们试着更接近你的错误。

> app = {}
{}
> app.event = 1
1
> app.event()
Uncaught TypeError: app.event is not a function

更近一点,但请注意我们在错误中遗漏了

(...)
部分。这里
app.event
不是函数。 (这是一个数字)。让我们继续前进。

> app.event = () => 1
[Function (anonymous)]
> app.event()()
Uncaught TypeError: app.event(...) is not a function

哈!此错误具有正确的格式。这意味着调用函数

app.event
(例如使用
app.event()
)时返回的值不是函数。事实上我们做到了
app.event()
的返回值只是数字 1.

让我们让它返回一个函数

> app.event = () => () => 1
[Function (anonymous)]
> app.event()()
1

太棒了!有用。那么你可能做了什么?好吧,你有

async
在那里,一个未等待的异步函数返回一个承诺。让我们演示一下

> app.event = async () => () => 1
[AsyncFunction (anonymous)]
> app.event()()
Uncaught TypeError: app.event(...) is not a function

这可能是你所做的——不知何故。 (修复方法是等待返回函数的承诺。)我不能确定,因为您的代码片段不完整并且不能代表实际错误。

但这可能是另一件更简单的事情;

我预测,因为你没有在行尾使用分号,你可能不小心调用了这样的函数:

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
})
(somethingInParenthesesHere)

以上是JavaScript中自动分号插入的著名歧义。它使它看起来像

app.event()(somethingInParenthesesHere)
,就像您将
app.event()
的结果作为函数调用并将
somethingInParenthesesHere
作为参数传递一样。

一种常见的“somethingInParenthesesHere”是 IIFE。例如:

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
})

(function (){ /* blah-blah-blah */ })();

这样的问题可以通过在正确的位置添加分号来纠正。

app.event('app_home_opened', async ({event, client, context}) => {
  // things happen over 50 lines
});   // <-- semicolon is needed in this case.

(function (){ /* blah-blah-blah */ })();

更多推荐

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

本文发布于:2024-05-28 12:07:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1770144.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   将它   它就   中就   装在

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!