使用RxJS的工作流运行程序
我想运行一个工作流,用户可以定义并提供给一个将使用RxJS运行的程序。工作流中的每个项目都有一个操作、输入和输出:使用RxJS的工作流运行程序,rxjs,Rxjs,我想运行一个工作流,用户可以定义并提供给一个将使用RxJS运行的程序。工作流中的每个项目都有一个操作、输入和输出: const steps = [ { action: someAction, inputs: [], outputs: [] } ] 输出可能没有定义;它们可能只是行动的结果。我还不是100%确定。它可以走任何一条路。此外,这个对象可能不是一切。他们可能还必须定义要使用的操作符,类似这样的东西 我知道我可以采取上述措施,并在RxJS管道中输出每一步
const steps = [
{
action: someAction,
inputs: [],
outputs: []
}
]
输出可能没有定义;它们可能只是行动的结果。我还不是100%确定。它可以走任何一条路。此外,这个对象可能不是一切。他们可能还必须定义要使用的操作符,类似这样的东西
我知道我可以采取上述措施,并在RxJS管道中输出每一步,如下所示:
from(steps).pipe(
... // operators here
).subscribe()
从技术上讲,每个步骤都可以这样运行,但步骤2需要步骤1的输出作为其输入:
步骤1运行,生成输出→ 步骤2使用来自步骤1的输入运行
我的问题是运行阵列中的每一步,在那里我可以获得结果并在管道的下一步中使用该结果。如果我对管道进行硬编码,我想我可以使用一系列的开关映射,但不确定如何一般地声明管道,以便用户可以提供要执行的操作,然后获取输入和输出
下面是一个工作流的示例:
步骤1:查询数据库中的用户信息
步骤2:获取信息并发送电子邮件
步骤3:将电子邮件结果保存到数据库中
const steps = [
{
action: fetch('path/to/api'),
inputs: userId,
outputs: ['name', 'email']
},
{
action: sendEmail(name, email),
inputs: [name, email],
outputs: status
},
{
action: saveToDatabase(status),
inputs: status,
outputs: result
}
];
同样,物体的形状不是用石头固定的,但需要这样做
任何关于如何实现这一点的提示或想法都将不胜感激。谢谢 因此,由于步骤N
的输出是步骤N+1
的输入,因此我想到了类似于scan
的东西。但是,由于生成输出的操作不是同步的,因此可以使用mergeScan
操作符
假设步骤的结构略有修改:
const steps=[
{
操作:userId=>fetch(`path/to/api/${userId}`),
输入:[userId],
输出:['name','email']
},
{
操作:(姓名,电子邮件)=>发送电子邮件(姓名,电子邮件),
输入:['name','email'],
输出:“状态”
},
]
我认为一种方法是:
来自(步骤)。管道(
合并扫描(
//“累加器”功能
//假定“prevOutput”和“step.inputs”都是**数组类型**
(prevOutput,step,index)=>step.action(…prevOutput==null?step.inputs:prevOutput),
//种子(初始值),
无效的
//'concurrent'参数-与'mergeMap'上使用的参数相同`
1.
),
);
请注意,为了涵盖所有情况,有一些更改:
step.inputs
属性现在是一个数组
- 如上所述,
step.outputs
属性现在是一个数组
step.action
现在是一个接受假定输入的函数
- 只有第一步的输入才会有实值,而不仅仅是字符串,因为下一步的输入取决于前一步的输出,而第一步没有前一步
我还要说,使用这种方法,outputs
属性仅用于调试目的,因为您可以拥有字符串值,因为您无法事先知道实际值。谢谢!这几乎是完美的。我只需要弄清楚为什么作为操作参数的先前输出或步骤输入的条件会导致错误。它一直说该操作需要一个参数,但我提供了0或更多。我猜这是一个类型脚本的东西,我能弄明白,但这是我认为到目前为止遇到的唯一问题。@pjlamb12我认为在一个地方涵盖所有案例是一种挑战,如果你将动作类型设置为“(…args:any[])=>any之类的话,也许会奏效?是的,我会尝试非常一般地键入它。在短期内,将动作参数设置为可选可以消除错误。再次感谢您的帮助。@pjlamb12我很高兴能帮上忙!