Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript XState:链接多个承诺而不使用中间状态_Javascript_Reactjs_Typescript_Xstate - Fatal编程技术网

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上发布一个功能请求。所有这些问题都可以使用serial
    invoke
    选项解决,因为
    invoke
    处理所有这些分支。