【问题标题】:Is that class method async ? (no instance)那个类方法是异步的吗? (无实例)
【发布时间】:2020-06-17 11:38:14
【问题描述】:

我有一个非常简单的问题,我一直在寻找但找不到解决方案。

获取该代码:

class Foo {
  bar = () => {
      return 'string'
  }

  baz = async() => {
      return 'promise'
  }
}

我想知道某个类的特定方法是否异步。

isAsync(Foo, 'bar') // false
isAsync(Foo, 'baz') // true

问题是......我不想实例化它。 我发现的所有解决方案都在类实例上使用“getOwnPropertyNames”来获取函数。

有可能吗?

谢谢! ????

【问题讨论】:

  • 在您的示例中没有实例化是不可能的,因为在创建实例之前barbaz 不存在。
  • 检查这不是一个好主意。任何异步函数都可以很容易地重构为返回承诺的普通函数,反之亦然,这不应该影响运行时行为。例如,如果您的 bar 函数执行了 bar = () => this.baz();,您真的会期望它的行为与 baz 直接不同吗?

标签: javascript class asynchronous ecmascript-6


【解决方案1】:

问题是......我不想实例化它。我发现的所有解决方案都在类实例上使用“getOwnPropertyNames”来获取函数。

有可能吗?

在您的具体示例中,barbazinstance class fields。和写是一样的

class Foo {
  constructor() {
    this.bar = () => {
       return 'string'
    };

    this.baz = async() => {
        return 'promise'
    };
  }
}

在您实际创建类的实例之前,这些属性(和函数)并不存在。

所以这个具体案例的答案是

如果您将函数声明为“普通”类方法,那么您可以简单地查看构造函数的 prototype 属性。

【讨论】:

  • 谢谢!我不知何故忘记了我没有使用“正常”的类方法。
【解决方案2】:
// the most simple way is
const isAsync = (someClass, name) => {
  if (name in someClass.prototype) 
    return someClass.prototype[name][Symbol.toStringTag] === 'AsyncFunction'

  const newInstance = new someClass()
  if (name in newInstance)
    return newInstance[name][Symbol.toStringTag] === 'AsyncFunction'
}

【讨论】:

  • 感谢您的回复,是否可以在不创建新实例的情况下实现此目的?
  • @KevinGilbert,这样不行,但如果你不匿名,而是async baz () {} 而不是baz = async() 那么是的,你可以通过someClass.prototype[name][Symbol.toStringTag] 来做到这一点
  • @KevinGilbert,我更新了我的答案,它可以双向工作
  • 当然const newInstance = new someClass() 可能不起作用或有不良副作用...
  • @FelixKling,是的,它不能通用,但是在这种特殊情况下它是唯一的选择,否则只有解析类代码才能解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2019-06-12
  • 2015-05-31
  • 1970-01-01
  • 2019-03-24
  • 2011-02-21
  • 2011-03-15
相关资源
最近更新 更多