# Engines auf der Client- und Web-Seite

FormIt-Plugins verwenden zwei unterschiedliche JavaScript-Engines:

* Die Gruppe, die den HTML-Code anzeigt (Web-Seite)
* Die Client-Seite (FormIt) sendet Aufrufe an FormIt und den Geometrie-Kernel.

Diese beiden JavaScript-Engines arbeiten in unterschiedlichen Prozessen.

## **Client-Seite (FormIt) und Web-Seite (HTML)**

FormIt führt mehrere JavaScript-Engines gleichzeitig aus:

* Die FormIt-Anwendung verfügt über eine eigene JavaScript-Engine.
* Jeder Plugin-Werkzeugkasten verfügt über eine eigene JavaScript-Engine.
* Jede Plugin-Gruppe verfügt über eine eigene JavaScript-Engine (Chromium).

Plugins können festlegen, wo JavaScript geladen wird:

![](/files/OXO6jtEfqRdZeAOp5jDl)

### Client-Seite (FormIt)

Durch [manifest.json](https://github.com/FormIt3D/FormItExamplePlugins/blob/master/HelloBlockAsync/v23_0/manifest.json#L8) angegeben

```
    "Scripts": [
        "PLUGINLOCATION/blockFormItSide.js",
        "https://formit3d.github.io/FormItExamplePlugins/SharedPluginFiles/PluginUtils18_0.js"
    ]
```

### Web-Seite (HTML)

Durch [index.html](https://github.com/FormIt3D/FormItExamplePlugins/blob/master/HelloBlockAsync/v23_0/index.html#L7) angegeben

* Web-Seiten-Skripte werden von der Webseite geladen.
* Web-Seiten-Skripte können JavaScript auf der Client-Seite (FormIt) mit mehreren asynchronen Aufrufen anrufen.

## Drei Methoden zum Aufrufen von Client-Seiten-Befehlen (FormIt) von einem webbasierten Plugin:

### Methode 1: FormItInterface.CallMethod

`CallMethod` verwendet einen Funktionsnamen und die Argumente, die auf der FormIt-Seite ausgeführt werden. Die übergebene Funktion wird mit dem Ergebnis des Funktionsaufrufs aufgerufen.

```
    var args = {
        "w": 10,
        "l": 10,
        "h": 10
    }
    FormItInterface.CallMethod("CreateBlock", args, function(result)
    {
        // Result of the function call
    });
```

**Vorteile:**

➕ Kein `await` erforderlich

**Nachteile:**

➖ Ein Rückruf ist erforderlich, um das Ergebnis zu erhalten. Dieser erfolgt "wann auch immer".

➖ Skripte werden an zwei verschiedenen Stellen definiert.

➖ Plugin-Logik muss in zwei verschiedene Dateien aufgeteilt werden.

### **Method 2: FormIt.CallJS**

\***Nur in FormIt 2022.1 und höher verfügbar**

CallJS verwendet die auf der FormIt-Seite aufzurufende JavaScript-Funktion und das arguments.json-Objekt.

```
var args =
{
    "w": 10,
    "l": 10,
    "h": 10
};
var result = await FormIt.CallJS("CreateBlock", args);
```

**Vorteile:**

➕ Das Ergebnis dann verfügbar, wenn es gebraucht wird.

**Nachteile:**

➖ \*\*\*\* Alle async-Aufrufe müssen mit await ausgezeichnet werden. Wenn dies vergessen wird, gerät alles durcheinander.

➖ \*\*\*\* Möglicherweise langsamer aufgrund von `await`

### **Methode 3 (async/await)**

```
const pt1 = await WSM.Geom.Point3d(0,0,0);
```

Bei einem async-Aufruf ruft die Web-Seite die FormIt-Seite auf. Dieser Aufruf startet in einem Prozess, wird an einen anderen Prozess gesendet, und das Ergebnis wird an den Startprozess zurückgegeben. Deshalb ist await notwendig.

Nur integrierte FormIt-APIs können vorgabemäßig aufgerufen werden.

**Vorteile:**

➕ Das Ergebnis ist dann verfügbar, wenn es gebraucht wird.

➕ Ermöglicht die Kombination des gesamten Codes in einer JS-Datei, die über die Web-Seite ausgeführt wird, ohne dass Skripts in manifest.json definiert sind.

**Nachteile:**

➖ \*\*\*\* Alle async-Aufrufe müssen mit `await` ausgezeichnet werden. Wenn dies vergessen wird, gerät alles durcheinander.

➖ \*\*\*\* Möglicherweise langsamer aufgrund von `await.`

### Methode 4 (RegisterAsyncAPI)

\***Nur in FormIt 2023.0 und höher verfügbar**

Um eine benutzerdefinierte Funktion auf der FormIt-Seite aufzurufen, muss die Funktion registriert werden. Beispiel:

**Client-Seite (FormIt)**

```
FormIt.RegisterAsyncAPI("HelloBlockAsync", "CreateBlock", "l, w, h");
// CreateBlock runs from FormIt.
HelloBlockAsync.CreateBlock = function(args)
{
    return { "Result" : "It Worked!!"};
}
```

**Web-Seite (HTML)**

```
var result = await HelloBlockAsync.CreateBlock(l, w, h);
```

Ein Beispiel finden Sie unter [HelloBlockAsync](https://github.com/FormIt3D/FormItExamplePlugins/tree/master/HelloBlockAsync/v23_0).

**Vorteile:**

➕ Das Ergebnis ist dann verfügbar, wenn es gebraucht wird.

➕ Ermöglicht die Kombination des gesamten Codes in einer JS-Datei, die über die Web-Seite ausgeführt wird, ohne dass Skripts in manifest.json definiert sind.

**Nachteile:**

➖ \*\*\*\* Alle async-Aufrufe müssen mit await ausgezeichnet werden. Wenn dies vergessen wird, gerät alles durcheinander.

➖ \*\*\*\* Möglicherweise langsamer aufgrund von `await.`

##


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://windows.help.formit.autodesk.com/de/plugins/how-to-develop-plugins/advanced-development/client-side-vs-web-side-engines.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
