javascript es6中链接静态和非静态方法

时间:2019-09-04 14:59:44

标签: javascript class static chaining

当我链接的第一个函数是从同一类返回对象实例的静态方法时,如何从某个类链接多个函数?

静态方法的目的是用于建立策略模式的工厂方法,根据提供者处于活动状态,它将设置具有不同子类的类的策略属性。最后,静态方法返回基类的实例。

我有一个可行的解决方案,首先调用静态方法,然后将对象实例保存在变量引用中。之后,我要调用其他函数。我只想通过链接将代码压缩在一行中。

// Commented code works
// Provider is the base class
// getActiveProvider is the static method and return Provider class object instance
// findNumbersByIds is non static method
// const provider = await Provider.getActiveProvider();
// return await provider.findNumbersByIds([...]);

// This one not working
 return await Provider.getActiveProvider().findNumbersByIds([...]);

我希望通过链接获得正确的结果,就像没有链接一样。

BR,伊戈尔

1 个答案:

答案 0 :(得分:2)

TLDR:您缺少括号,因为await的优先级比.低。

问题不在于链接,问题在于您滥用了await语法。

以下示例显示了您使用静态和非静态方法进行链接的方式可以正常工作:

class X {
  static create() {
    console.log('created');
    return new X();
  }
  
  y() {
    console.log('y');
    return this;
  }
}

x = X.create().y().y();

下面是一个示例,显示了两种方法都异步时如何正确执行相同操作:

class X {
  static async create() {
    console.log('created');
    return new X();
  }
  
  async y() {
    console.log('y');
    return this;
  }
}

let main = async () => {
  x = await (await (await X.create()).y()).y();
};
main();

以您的示例为例,要纠正语法,只需添加一对括号:

return (await Provider.getActiveProvider()).findNumbersByIds([...]);