# Synchronously perform executeAsModal on every layer from activeLayers array

**URL:** <https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034>\
**Category:** Photoshop\
**Created:** [July 30, 2022, 10:27am UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034 "2022-07-30T10:27:01Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![bbogdan](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/bbogdan/32/2272_2.png) [@bbogdan](https://forums.creativeclouddeveloper.com/u/bbogdan)\
**Post date:** [July 30, 2022, 10:27am UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/1 "2022-07-30T10:27:01Z")

</div>

Hi,  
Is there a way to synchronously perform executeAsModal on every selected layer from **activeLayers** array? I tried to await executeAsModal promise and even then it breaks that synchronous operation and gives incorrect result (some transformations are applied before others and sometimes multiple times in a row before others are applied).

Here is some sample to code for what I want to achieve:

```auto
const handleExecution = async () => {
    // Check if there is any active document before executing the function
    if (!app.activeDocument) {
      await app.showAlert("No active document!");
      return;
    }
    const originalLayers = app.activeDocument.activeLayers;
    originalLayers.forEach(async (layer) => {
      await transformLayer(layer)
      });
    });
  };

```

And the code for **transformLayer** function:

```auto
import { app, constants, core } from "photoshop";
import { Layer } from "photoshop/dom/Layer";

export const transformLayer= async (
  layer: Layer
) => {
  try {
    await core.executeAsModal(
      async () => {
        const newLayer = await layer.duplicate();
        newLayer .selected = true;
        newLayer .name = "New layer";
        await newLayer.scale(100, 50, constants.AnchorPosition.BOTTOMCENTER);
        newLayer.opacity = 50;
        newLayer.move(layer, constants.ElementPlacement.PLACEAFTER);
        newLayer.link(layer);
        newLayer.selected = false;
        layer.selected = true;
      },
      { commandName: "Creating a transformed layer..." }
    );
  } catch (e) {
    console.log(e);
  }
};

```

---

<div class="post-metadata">

**Author:** ![bbogdan](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/bbogdan/32/2272_2.png) [@bbogdan](https://forums.creativeclouddeveloper.com/u/bbogdan)\
**Post date:** [July 30, 2022, 10:31am UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/2 "2022-07-30T10:31:53Z")

</div>

Or should I have multiple executeAsModal for every operation on the layer or is it fine to group them all into a single executeAsModal?

---

<div class="post-metadata">

**Author:** ![Karmalakas](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/karmalakas/32/1048_2.png) [@Karmalakas](https://forums.creativeclouddeveloper.com/u/Karmalakas)\
**Post date:** [July 30, 2022, 12:29pm UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/3 "2022-07-30T12:29:02Z")

</div>

Wrap everything in execModal. You can also have execModal inside execModal. So I think this should be enough:

```auto
await core.executeAsModal(
  handleExecution,
  { commandName: "Creating a transformed layer..." }
)

```

---

<div class="post-metadata">

**Author:** ![bbogdan](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/bbogdan/32/2272_2.png) [@bbogdan](https://forums.creativeclouddeveloper.com/u/bbogdan)\
**Post date:** [August 2, 2022, 7:13pm UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/4 "2022-08-02T19:13:02Z")

</div>

I tried it and it didn’t help. It turns out that some operations are still performed before others. In the end, I would like to have it like this:

1. User selects for example 2 layers.
2. Transformations applied to layer 1. Done.
3. Transformations applied to layer 2. Done.

So it goes exactly in this order. And right now it does it like this:

1. User selects 2 layers.
2. Transformations applied to layer 1 and layer 2 simultaneously (this is incorrect because some transformations are applied twice or more times in a row depending on the number of selected layers).

---

<div class="post-metadata">

**Author:** ![Karmalakas](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/karmalakas/32/1048_2.png) [@Karmalakas](https://forums.creativeclouddeveloper.com/u/Karmalakas)\
**Post date:** [August 2, 2022, 7:25pm UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/5 "2022-08-02T19:25:40Z")

</div>

Ah… Don’t use `forEach` with async/await. Switch to `for`

---

<div class="post-metadata">

**Author:** ![bbogdan](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/bbogdan/32/2272_2.png) [@bbogdan](https://forums.creativeclouddeveloper.com/u/bbogdan)\
**Post date:** [August 2, 2022, 7:33pm UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/6 "2022-08-02T19:33:35Z")

</div>

Yep. That worked! Thanks Karmalakas

---

<div class="post-metadata">

**Author:** ![bbogdan](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/bbogdan/32/2272_2.png) [@bbogdan](https://forums.creativeclouddeveloper.com/u/bbogdan)\
**Post date:** [August 2, 2022, 7:39pm UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/7 "2022-08-02T19:39:38Z")

</div>

And now I just read that forEach expects only synchronous functions. It was a small note on the official MDN page. I will keep this in mind for future use cases 🙂 Thanks again

---

<div class="post-metadata">

**Author:** ![Jarda](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/jarda/32/1909_2.png) [@Jarda](https://forums.creativeclouddeveloper.com/u/Jarda)\
**Post date:** [August 2, 2022, 9:01pm UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/8 "2022-08-02T21:01:16Z")

</div>

I would recommend you to wrap the whole loop into executeAsModal if that loop has to run uninterrupted by other plugins or by the user. Also, I think you will get some performance gain and better possibility to report progress into the progress bar, and also better history suspension.

---

<div class="post-metadata">

**Author:** ![bbogdan](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/bbogdan/32/2272_2.png) [@bbogdan](https://forums.creativeclouddeveloper.com/u/bbogdan)\
**Post date:** [August 2, 2022, 9:34pm UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/9 "2022-08-02T21:34:49Z")

</div>

Alright. Thanks. I just did that and I see some performance improvements. I also suspended history into a single state.

---

<div class="post-metadata">

**Author:** ![Karmalakas](https://sea1.discourse-cdn.com/flex015/user_avatar/forums.creativeclouddeveloper.com/karmalakas/32/1048_2.png) [@Karmalakas](https://forums.creativeclouddeveloper.com/u/Karmalakas)\
**Post date:** [August 3, 2022, 5:30am UTC](https://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/10 "2022-08-03T05:30:23Z")

</div>

Exactly what I suggested [here](http://forums.creativeclouddeveloper.com/t/synchronously-perform-executeasmodal-on-every-layer-from-activelayers-array/5034/3) 🙂
