函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作"/>
为什么这个 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 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作
发布评论