使用“import(`./player/${file}`)”导入文件不会产生预期值

Lin*_*gen 0 javascript dynamic-import commonjs ecmascript-6

我有这段代码可以在 CommonJS 上运行,但我想将我的项目切换到 ES6,但我得到的错误是.bindisn\xe2\x80\x99t 函数,所以我想知道是否有人知道我如何切换它超过。

\n
for (const file of player) {\n  const event = import(`./player/${file}`);\n\n  Storage.player.on(file.split(".")[0], event.bind(null, client));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Seb*_*mon 5

您\xe2\x80\x99 正在使用动态导入。\n请查看MDN Web Docs 上的文档

\n
\n

要动态导入模块,import可以将关键字作为函数调用。当以这种方式使用时,它会返回一个承诺。

\n
\n

所以你有一个Promise,而不是Function。 \n一如既往,你可以简单地使用console.log(event);或任何其他调试技术来检查event实际情况。

\n

如果您\xe2\x80\x99位于异步函数内部或ES6模块的顶层,您可以简单地尝试使用await前面的关键字import。\n但是,您始终可以使用.then来接收导入的值。\n请确保还处理导入错误,例如使用.catch.

\n

请参阅如何从异步调用返回响应

\n

当您\xe2\x80\x99 在循环中导入内容时,请考虑使用异步迭代技术,例如Promise.all.\nplayer是可迭代的;如果它\xe2\x80\x99s 也Array可以使用该.forEach方法并使用回调中的动态导入绑定所有侦听器。\nArray.from如果这不起作用\xe2\x80\x99 不起作用,你绝对可以使用 的第二个参数。

\n

所以,这里\xe2\x80\x99是我关于如何重写这段代码的建议,尽管有更多的上下文,可能有更好的方法来处理异步性:

\n
player.forEach(async (file) => Storage.player.on(\n  file.split(".")[0],\n  (await import(`./player/${file}`)).bind(null, client)\n));\n
Run Code Online (Sandbox Code Playgroud)\n

除了错误处理之外,您剩下要做的就是断言所有导入的文件实际上都解析为函数,否则您仍然不会\xe2\x80\x99t有一个.bind方法。

\n