我正在尝试创建一个结构,在其中可以堆叠扩展同一父类的多个类。通过堆叠,我的意思是在以下示例中类似于堆叠then
:
promise.then(
data=>{
return promise;
}
).then(
data=>{
return promise;
}
).then(
....
)
其中第二个data
是由第一个返回的承诺解决的那个。
就我而言,我有一个operation
类,它具有多个子类createUser
,sendEmail
和generateConfig
。并且我希望能够通过以下方式进行堆叠:
let generateConfigREturnedValue = createUser(null, usercreationInput)
.sendEmail(createUSerReturnedValue, sendEmailInput)
.generateConfig(sendEmailReturnedValue, generateConfigInput)
.finish();
我希望能够以上述方式堆叠扩展操作父类的任何类。
Note: ReturnedValue
参数不是以这种方式显式传递的,而是nextInline操作将如何传递和接收它们。
编辑:
因此,父类operation
类将具有一个称为execute
的抽象方法,该方法将自动称为wen链接子类(子类将在该方法中具有其主要代码)。因此,从技术上讲,我所说的类链接是在传递参数时链接每个类的execute
方法。
我的想法:
将所有子操作添加到每个子操作的原型中,因此所有子操作将相互调用。之后,我需要在后台设置从操作传递到另一个的参数。
在父类operation
类上扩展原型属性查找,以包括使用从依赖关系容器中获取对象的名称来获取对象(类似于awilix等)
我想做的事是可以实现的,而这是上面夫妇中最好的想法?
首先,如果您的函数执行异步操作以获取结果,则您不能指望.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