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

Importing a file using “import(`./player/${file}`)” doesn’t result in the expected value

我有这段代码可以在 CommonJS 上运行,但我想将我的项目切换到 ES6,但我收到 .bind 不是函数的错误,所以我想知道是否有人知道我将如何切换它。

for (const file of player) {
  const event = import(`./player/${file}`);

  Storage.player.on(file.split(".")[0], event.bind(null, client));
}

您正在使用动态导入。 看看 documentation on MDN Web Docs:

To dynamically import a module, the import keyword may be called as a function. When used this way, it returns a promise.

所以你有一个Promise, not a Function。 与往常一样,您可以简单地使用 console.log(event); 或任何其他 debugging technique 来检查 event 实际上是什么。

如果您位于 import 前面的 async function or top-level in an ES6 module, you can simply try using the await 关键字内。 但是,您始终可以使用 .then 来接收导入的值。 确保还处理导入错误,例如使用 .catch.

参见 How to return the response from an asynchronous call

当您在循环中导入内容时,请考虑使用 Promise.all 等异步迭代技术。 player 是一个可迭代对象;如果它也是一个 Array you can use the .forEach 方法并在回调中使用动态导入绑定所有侦听器。 如果不行,你绝对可以使用 Array.from 的第二个参数。

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

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

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