statelyai / xstate

Actor-based state management & orchestration for complex app logic.
https://stately.ai/docs
MIT License
26.98k stars 1.24k forks source link

Allow inline actor logic #4806

Closed davidkpiano closed 5 months ago

changeset-bot[bot] commented 6 months ago

🦋 Changeset detected

Latest commit: 610b25eab4d36c18d10b358750921343f1c67be8

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package | Name | Type | | ------ | ----- | | xstate | Minor |

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

codesandbox-ci[bot] commented 6 months ago

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Andarist commented 6 months ago

The problem is that by allowing inline actor logics you allow them to override the ones that are configured and that leads to problems:

const m = setup({
  types: { children: { foo: 'myChild' } },
  actors: {
    myChild: fromPromise(async () => "")
  }
}).createMachine({
  entry: spawnChild(fromPromise(async () => 100), { id: 'foo' })
})

const actorRef = createActor(m)
const val = actorRef.getSnapshot().children.foo.getSnapshot().output // actual: number | undefined, expected: string | undefined
davidkpiano commented 6 months ago

The problem is that by allowing inline actor logics you allow them to override the ones that are configured and that leads to problems:

const m = setup({
  types: { children: { foo: 'myChild' } },
  actors: {
    myChild: fromPromise(async () => "")
  }
}).createMachine({
  entry: spawnChild(fromPromise(async () => 100), { id: 'foo' })
})

const actorRef = createActor(m)
const val = actorRef.getSnapshot().children.foo.getSnapshot().output // actual: number | undefined, expected: string | undefined

This really makes me think that the way that child actors are defined is a bit awkward currently. Would love to revisit this for v6