# Run multiple commands in sequence

**URL:** <https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518>\
**Category:** Uncategorized\
**Created:** [September 18, 2018, 5:56pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518 "2018-09-18T17:56:53Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![philippkuehn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/philippkuehn/32/1820_2.png) [@philippkuehn](https://discuss.prosemirror.net/u/philippkuehn)\
**Post date:** [September 18, 2018, 5:56pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/1 "2018-09-18T17:56:53Z")

</div>

Is it possible to run multiple commands in sequence? First I thought `chainCommands` is the solution but this function does another job.

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)\
**Post date:** [September 19, 2018, 12:12pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/2 "2018-09-19T12:12:59Z")

</div>

You can call them one after the other. Is there anything about that that is causing problems for you?

---

<div class="post-metadata">

**Author:** ![philippkuehn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/philippkuehn/32/1820_2.png) [@philippkuehn](https://discuss.prosemirror.net/u/philippkuehn)\
**Post date:** [September 27, 2018, 10:43am UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/3 "2018-09-27T10:43:16Z")

</div>

Yeah, my fault 🤦‍♂️😅

---

<div class="post-metadata">

**Author:** ![alexaaaant](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/alexaaaant/32/3580_2.png) [@alexaaaant](https://discuss.prosemirror.net/u/alexaaaant)\
**Post date:** [January 19, 2024, 11:40am UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/4 "2024-01-19T11:40:54Z")

</div>

Hi guys! It does not seem to work. In my case just the last command work, because the first command creates a transaction and call dispatch() but all the following work with old transaction

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)\
**Post date:** [January 19, 2024, 12:41pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/5 "2024-01-19T12:41:41Z")

</div>

Commands don’t compose like that. You can call multiple commands in order to execute them after each other. But you can’t make them combine their transactions.

---

<div class="post-metadata">

**Author:** ![alexaaaant](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/alexaaaant/32/3580_2.png) [@alexaaaant](https://discuss.prosemirror.net/u/alexaaaant)\
**Post date:** [January 19, 2024, 12:54pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/6 "2024-01-19T12:54:09Z")

</div>

> You can call multiple commands in order to execute them after each other

Do you think this is possible? Commands call dispatch() inside them, so it means that we should pass another updated state into the next command. Imagine the case:

```auto
const runCommands = (state, dispatch) => {
   command1(state, dispatch);
   command2(state, dispatch); // the state here would be still
}

```

as the result just the command2 will be applied

another example:

```auto
const runCommands = (state, dispatch) => {
   command1(state, (tr) => {
      const newState = state.tr.apply(tr);
      command2(state, dispatch); // prosemirror throws an error here that the tr is still or mismatched
   });

```

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)\
**Post date:** [January 19, 2024, 1:09pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/7 "2024-01-19T13:09:16Z")

</div>

The idea would be

```auto
command1(view.state, view.dispatch)
command2(view.state, view.dispatch)

```

---

<div class="post-metadata">

**Author:** ![alexaaaant](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/alexaaaant/32/3580_2.png) [@alexaaaant](https://discuss.prosemirror.net/u/alexaaaant)\
**Post date:** [January 19, 2024, 1:29pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/8 "2024-01-19T13:29:57Z")

</div>

Unfortunately, it does not work.

In the command1 we call dispatch(state.tr); and the command2 gets the old state.tr and call it’s own dispatch(state.tr)

---

<div class="post-metadata">

**Author:** ![andrews](https://discuss.prosemirror.net/letter_avatar_proxy/v4/letter/a/898d66/32.png) [@andrews](https://discuss.prosemirror.net/u/andrews)\
**Post date:** [January 20, 2024, 5:21pm UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/9 "2024-01-20T17:21:03Z")

</div>

> [@alexaaaant](#):
>
> ```auto
> const newState = state.tr.apply(tr);
> command2(state, dispatch);
> 
> ```

I assume you meant to use newState in the 2nd line?

---

<div class="post-metadata">

**Author:** ![alexaaaant](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/alexaaaant/32/3580_2.png) [@alexaaaant](https://discuss.prosemirror.net/u/alexaaaant)\
**Post date:** [January 22, 2024, 8:09am UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/10 "2024-01-22T08:09:59Z")

</div>

yes, exactly

---

<div class="post-metadata">

**Author:** ![1inus](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/1inus/32/3709_2.png) [@1inus](https://discuss.prosemirror.net/u/1inus)\
**Post date:** [June 20, 2025, 1:18am UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/11 "2025-06-20T01:18:56Z")

</div>

In my case: “prosemirror-state”: “^1.4.3” “prosemirror-transform”: “^1.10.4”, “prosemirror-view”: “^1.40.0”

This is my approach:

```typescript
const view = editorView
const { state, dispatch } = view
const { tr, schema, selection } = state;
const $pos = selection.$from
const pos = $pos.after()
const { paragraph, blockquote } = schema.nodes
const p = paragraph.create();
tr.insert(pos, p).setSelection(TextSelection.create(tr.doc, pos + 1));
const newState = state.apply(tr)
wrapIn(blockquote)(newState, (wrapTr) => {
    wrapTr.steps.forEach(step => tr.step(step))
    dispatch(tr);
})

```

This way I can perform other operations before calling the command, and submit everything in one dispatch within the command.

The 2 keypoint is:

```typescript
const newState = state.apply(tr)

```

and

```typescript
wrapTr.steps.forEach(step => tr.step(step))

```

---

<div class="post-metadata">

**Author:** ![prosed](https://discuss.prosemirror.net/letter_avatar_proxy/v4/letter/p/aeb1de/32.png) [@prosed](https://discuss.prosemirror.net/u/prosed)\
**Post date:** [June 26, 2025, 12:40am UTC](https://discuss.prosemirror.net/t/run-multiple-commands-in-sequence/1518/12 "2025-06-26T00:40:34Z")

</div>

TipTap has a `createChainableState` that you might like to take a look at:

> <https://github.com/ueberdosis/tiptap/blob/d598dab3fb7fa71686e0cc84506db0877a28846f/packages/core/src/helpers/createChainableState.ts>

The logic isn’t all contained in that file but it’s a good starting point for investigating their approach.
