运行 对象中存储的函数

Run a Function Stored in an Object

我用ES6文档创建对象,成功了!但是,当我尝试通过 shardHandler('help') 之类的方式调用函数时,控制台显示 Promise { <pending> } 但从未调用 1、2、3、4 等。

下面是我的代码。如何从对象内部调用函数?

const shardHandler = async (arg) => ({
  "ids": (client, message) => {
    console.log('1')
  },
  "respawn": (client, message) => {
    console.log('2')
  },
  "kill": (client, message) => {
    console.log('3')
  },
  "restart": (client, message) => {
    console.log('4')
  },
  "help": (message) => {
    console.log('5')
  }
})[arg] || "help";
const run = async () => shardHandler('kill');
run()

你这里有几个问题。

首先,调用 shardHandler returns 一个 Promise 因为它是一个 async 函数。因此,如果您想访问您在对象中定义的函数之一,则必须 await 承诺。

const shardHandler = async (arg) => ({
  "kill": (client, message) => {
    console.log('3')
  },
})[arg]

const run = async () => {
  const result = await shardHandler('kill')
  result()
}

run()

然后我还看到,如果没有向 shardHandler 提供任何参数,您试图默认返回“帮助”,但您编写的方式不会那样工作:您只是解决了实际字符串 "help" 而不是函数。以下是实现方法:

const shardHandler = async (arg) => ({
  // ...
})[arg || "help"];
const shardHandler = async (arg = "help") => ({
  // ...
})[arg];

然后,除非有某些特定原因您没有在此处显示(这可能是完全合适的,因为在发布之前必须简化他们的问题!),shardHandler 不需要是函数:把它变成一个对象。

const shardHandler = {
  "ids": (client, message) => {
    console.log('1')
  },
  "respawn": (client, message) => {
    console.log('2')
  },
  "kill": (client, message) => {
    console.log('3')
  },
  "restart": (client, message) => {
    console.log('4')
  },
  "help": (message) => {
    console.log('5')
  }
}
const run = () => shardHandler['kill']()

最后,async 关键字的位置似乎很奇怪。如果没有更完整的代码版本,很难确定,但要小心。调用一个 async 函数总是 returns 一个 Promise 然后你必须从 another async 中用 await 处理上下文,或使用 .then() 以获得实际的“所需”输出。