评估异步函数定义

Posted

技术标签:

【中文标题】评估异步函数定义【英文标题】:Evaling async function definitions 【发布时间】:2021-12-19 23:41:12 【问题描述】:

我正在开发一个用于 javascript 的 IDE,它允许 开发人员评估他们的代码。 在现代 Chrome 控制台中,我可以运行:

eval(`tryfunction foo3()console.log("Hi") catch(err)console.log(err)`)

和 foo3 将被定义并正常调用。 我也可以跑:

eval(`async function foo4()console.log("Hi")`)

和 foo4 将被定义并正常调用。 但是当我运行时:

eval(`tryasync function foo5()console.log("Hi") catch(err) console.log(err)`)

我没有收到任何错误,但 foo5 未定义。 请注意,示例 1 和 示例 3 只是“功能”之前的“异步”。 我希望 foo5 被定义。 非常感谢线索。

【问题讨论】:

中的函数声明由于 Web 兼容性原因而表现异常,通常最好避免。 This 好像也有关系 try/catch 的意义何在?你永远不会仅仅从定义一个函数中得到一个异常。 感谢 Nick,它有助于实现 jS 的这个灰色地带。 Bergi,程序员可能为函数输入了错误的语法,所以外部的 try/catch 可以帮助捕捉到它。 @user1343035 不,它没有。如果语法无效,则不会运行整个语句。您需要将 try 块放在 eval() 调用周围以捕获语法错误。 【参考方案1】:

好吧,您可以稍微反转您的代码,将try/catch 块包含在您的async 函数中以使其运行。

eval(`async function foo5() try console.log("Hi") catch (err)  console.log(err)`);

foo5();

【讨论】:

根据 OP 提供的信息,我假设他们正在编码的 IDE 中的“评估器”是这样的:eval(`try $CUSTOM_CODE_HERE catch(err)console.log(err)`),因此将目标函数移到 try 之外可能不会行不通(这就是我的理解)。 好吧,eval 只是执行字符串,就好像它是一段实际的 javascript 代码一样。所以反转代码,我觉得应该可以正常工作。 NullDev,是的,您对我的实际用例做了更好的描述,谢谢。萨尔维诺 我怀疑你是对的。您的回答是对问题的一个非常聪明的“重构”。虽然不是很理想,但只要稍加努力,就可以很好地解决我的问题。 是的,如果您觉得这个答案有用,请接受并点赞。

以上是关于评估异步函数定义的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“未定义”不是函数(评估“$(文档)”)

反应本机路由器通量:TypeError:未定义不是函数(评估'addListener')

r 添加自定义评估函数度量(matthew相关系数)以评估插入符号模型

R语言构建xgboost模型:自定义损失函数(目标函数loss functionobject function)评估函数(evaluation function)

获取未定义不是抽屉导航中的函数(评估'(0,_reactNavigation.stacknavigator)')

sklearn基于make_scorer函数构建自定义损失函数或者评估指标