Javascript XState:链接多个承诺而不使用中间状态
我读过这一节,它说一个人可以调用多个承诺,但在我自己的测试中,它们看起来是在不等待前一个承诺完成的情况下被调用的Javascript XState:链接多个承诺而不使用中间状态,javascript,reactjs,typescript,xstate,Javascript,Reactjs,Typescript,Xstate,我读过这一节,它说一个人可以调用多个承诺,但在我自己的测试中,它们看起来是在不等待前一个承诺完成的情况下被调用的 // ... invoke: [ { id: 'service1', src: 'someService' }, { id: 'service2', src: 'someService' }, { id: 'logService', src: 'logService' } ], // ... 这也是创建中间状态的解决方法 states: { first: {
// ...
invoke: [
{ id: 'service1', src: 'someService' },
{ id: 'service2', src: 'someService' },
{ id: 'logService', src: 'logService' }
],
// ...
这也是创建中间状态的解决方法
states: {
first: {
invoke: {
src: 'one',
onDone: {
target: 'second',
}
}
},
second: {
invoke: {
src: 'two',
onDone: {
target: 'success',
}
}
},
success: {
type: 'final'
}
}
有没有一种方法可以像Promise.each
,通过invokes,使invoke([])连续运行
我只能看到两种选择:
所有有状态行为都需要在状态机中显式显示。如果希望承诺按顺序运行,这是有状态的——在下一个承诺开始之前检查每个承诺的状态。因此,您需要多个状态,就像您发布的解决方案一样 但是,您可以创建一个帮助器函数来完成您想要的功能:
异步函数序列(…promiseCreators){
for(承诺创造者的持续承诺创造者){
等待承诺创造者();
}
返回;
}
// ...
调用:{
src:()=>序列(createPromise1、createPromise2、createAsyncLogger)
}
// ...
但这带来了更多的问题:
- 如果发生错误怎么办?(添加
)try/catch
- 中断/取消怎么办?你是怎么处理的
- 您如何汇总从承诺中解析的数据
- 如何处理依赖关系解析;i、 e.承诺A取决于来自承诺B的数据
<>这些可以很容易地回答你的用例,但是有很多可能的用例需要考虑。这就是为什么最好明确承诺的顺序(使用中间状态),而不是让库(XState)对您的用例做出假设。是的,这两个似乎是您的选择。他们怎么了?当然,您甚至可以编写一个简单的函数,自动从一系列服务中生成中间状态。invoke
SingleOrArray
接口看起来非常漂亮,并且组合在一起,似乎是一种很好的链接方式,并且非常清楚发生了什么。但事实并非如此,因为它是并行的,而且似乎没有其他方法可以说明,我试图找到的是类似redux saga effects的东西,例如,call
,但在xstate上下文中,调用不同的服务,并且能够在应用程序增长时将它们结合起来,而不创建中间功能。因此,承诺链接和内部机器的问题在于,您无法调用外部机器中定义的服务?在这种情况下,您可能应该在库的repo上发布一个功能请求。所有这些问题都可以使用serialinvoke
选项解决,因为invoke
处理所有这些分支。