Lin*_*gen 0 javascript dynamic-import commonjs ecmascript-6
我有这段代码可以在 CommonJS 上运行,但我想将我的项目切换到 ES6,但我得到的错误是.bindisn\xe2\x80\x99t 函数,所以我想知道是否有人知道我如何切换它超过。
for (const file of player) {\n const event = import(`./player/${file}`);\n\n Storage.player.on(file.split(".")[0], event.bind(null, client));\n}\nRun Code Online (Sandbox Code Playgroud)\n
您\xe2\x80\x99 正在使用动态导入。\n请查看MDN Web Docs 上的文档:
\n\n\n要动态导入模块,
\nimport可以将关键字作为函数调用。当以这种方式使用时,它会返回一个承诺。
所以你有一个Promise,而不是Function。 \n一如既往,你可以简单地使用console.log(event);或任何其他调试技术来检查event实际情况。
如果您\xe2\x80\x99位于异步函数内部或ES6模块的顶层,您可以简单地尝试使用await前面的关键字import。\n但是,您始终可以使用.then来接收导入的值。\n请确保还处理导入错误,例如使用.catch.
请参阅如何从异步调用返回响应。
\n当您\xe2\x80\x99 在循环中导入内容时,请考虑使用异步迭代技术,例如Promise.all.\nplayer是可迭代的;如果它\xe2\x80\x99s 也Array可以使用该.forEach方法并使用回调中的动态导入绑定所有侦听器。\nArray.from如果这不起作用\xe2\x80\x99 不起作用,你绝对可以使用 的第二个参数。
所以,这里\xe2\x80\x99是我关于如何重写这段代码的建议,尽管有更多的上下文,可能有更好的方法来处理异步性:
\nplayer.forEach(async (file) => Storage.player.on(\n file.split(".")[0],\n (await import(`./player/${file}`)).bind(null, client)\n));\nRun Code Online (Sandbox Code Playgroud)\n除了错误处理之外,您剩下要做的就是断言所有导入的文件实际上都解析为函数,否则您仍然不会\xe2\x80\x99t有一个.bind方法。