【问题标题】:Run a Function Stored in an Object运行存储在对象中的函数
【发布时间】:2020-10-28 06:33:36
【问题描述】:

我已经用 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()

【问题讨论】:

    标签: javascript node.js ecmascript-6 async-await es6-promise


    【解决方案1】:

    这里有几个问题。

    首先,调用shardHandler 返回一个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 提供任何参数,您正在尝试默认返回“帮助”,但您编写的方式不会那样工作:您只是解析到实际字符串 @987654327 @ 而不是函数。方法如下:

    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 函数总是返回一个Promise,然后您必须在另一个 async 上下文中使用await 或使用.then() 处理它以获得实际的“所需”输出.

    【讨论】:

    • 或者不要使用异步,因为这段代码绝对没有异步。
    • 是的,我也正要解决这个问题。我有点假设 async 在那里表明“在完整版本的代码中,这些函数需要异步”。
    • 谢谢!是的,这不是代码的完整版本。
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多