最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

NodeJS 中的顶级异步函数表达式调用不再起作用了?

网站源码admin43浏览0评论

NodeJS 中的顶级异步函数表达式调用不再起作用了?

NodeJS 中的顶级异步函数表达式调用不再起作用了?

我有一个 NodeJS 模块,用作服务器,在顶层调用异步函数表达式:

...
(async function func() {
    await sleep(180000);
    // do some stuff
})();
...
globalThis.sleep = function sleep(time) {
    return new Promise(r => setTimeout(r, time));
};
...

当我在 NodeJS 19.9.0 版本中运行它时,它没有任何问题。然而,我今天刚刚更新到 20.2.0 版,现在它给了我这个:

TypeError: (intermediate value)(...) is not a function
    at Object.<anonymous> (exec.js:59:3)
    at Module._compile (node:internal/modules/cjs/loader:1255:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1309:10)
    at Module.load (node:internal/modules/cjs/loader:1113:32)
    at Module._load (node:internal/modules/cjs/loader:960:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at node:internal/main/run_main_module:23:47

奇怪的是,当我在函数调用之前放置一个

console.log("dummy message");
时,它会立即调用该函数,没有 Promise 微任务(并为
ReferenceError
函数抛出一个
sleep()
)。我尝试将函数包装在
console.log()
中而不是调用它,果然,它说
[AsyncFunction func]
。我尝试降级回 19.9.0 版本,但它仍然有同样的问题。出了什么问题,我该如何解决?

操作系统:Linux 6.3.2-arch1-1
使用 Arch Linux 的 Pacman

回答如下:

这段代码 should 在所有版本的 Node 中做的是如您所描述的那样抛出 ReferenceError,因为您在分配它之前尝试使用

globalThis.sleep

我的猜测是你在异步函数之前的行中省略了一个分号,所以它周围的括号被解释为以异步函数作为参数的函数调用。这可以解释为什么在获得正确的(ReferenceError-throwing)行为之前添加一个以分号结束的代码行。您需要修复它和 ReferenceError 才能使此代码正常工作。

发布评论

评论列表(0)

  1. 暂无评论