具有公共父类的可链接类

问题描述 投票:0回答:1

我正在尝试创建一个结构,在其中可以堆叠扩展同一父类的多个类。通过堆叠,我的意思是在以下示例中类似于堆叠then

  promise.then(
      data=>{
        return promise;
      }
  ).then(
      data=>{
        return promise;
      }
  ).then(
      ....
  )

其中第二个data是由第一个返回的承诺解决的那个。

就我而言,我有一个operation类,它具有多个子类createUsersendEmailgenerateConfig。并且我希望能够通过以下方式进行堆叠:

let generateConfigREturnedValue = createUser(null, usercreationInput)

  .sendEmail(createUSerReturnedValue, sendEmailInput)

  .generateConfig(sendEmailReturnedValue, generateConfigInput)

  .finish();

我希望能够以上述方式堆叠扩展操作父类的任何类。

Note: ReturnedValue参数不是以这种方式显式传递的,而是nextInline操作将如何传递和接收它们。

编辑:

因此,父类operation类将具有一个称为execute的抽象方法,该方法将自动称为wen链接子类(子类将在该方法中具有其主要代码)。因此,从技术上讲,我所说的类链接是在传递参数时链接每个类的execute方法。

我的想法:

  1. 将所有子操作添加到每个子操作的原型中,因此所有子操作将相互调用。之后,我需要在后台设置从操作传递到另一个的参数。

  2. 在父类operation类上扩展原型属性查找,以包括使用从依赖关系容器中获取对象的名称来获取对象(类似于awilix等)

我想做的事是可以实现的,而这是上面夫妇中最好的想法?

javascript node.js prototype
1个回答
1
投票

首先,如果您的函数执行异步操作以获取结果,则您不能指望.finish()调用同步地]返回最终结果。您可以期望的最好是.finish()的承诺。

我建议在finish方法中进行所有艰苦的工作,而让所有其他方法仅收集输入数据。

我假设您已经具有核心异步功能,并且我将通过api对象引用它们:

class Chain {
    createUser(userCreationInput) {
        this.userCreationInput = userCreationInput;
        return this;
    }
    sendEmail: function(sendEmailInput) {
        this.sendEmailInput = sendEmailInput;
        return this;
    }
    generateConfig(generateConfigInput) {
        this.generateConfigInput = generateConfigInput;
        return this;
    }
    async finish() {
        let createUserReturnedValue = await api.createUser(null, this.userCreationInput);
        let sendEmailReturnedValue = await api.sendEmail(createUserReturnedValue, this.sendEmailInput);
        return api.generateConfig(sendEmailReturnedValue, this.generateConfigInput);
    }
}

let generateConfigReturnedValue = await new Chain()
    .createUser(usercreationInput)
    .sendEmail(sendEmailInput)
    .generateConfig(generateConfigInput)
    .finish();

显然await应该在async函数上下文中使用。

这只是专注于核心功能。您将不得不添加检查,以确保在调用finish时提供所有信息,并处理错误处理等。

如果您不喜欢表达式中的new Chain()部分,则可以将这三个方法也定义为全局函数,并让它们返回Chain的新实例。您可以选择散布全局名称空间还是使用额外的new Chain()

一个中间的基础是将函数也定义为静态方法-再次返回Chain的新实例。那么表达式将是:

let x = Chain.createUser(usercreationInput). // ...etc
© www.soinside.com 2019 - 2024. All rights reserved.