# Mecanismos do lado do cliente versus do lado da Web

Os plug-ins do FormIt usam dois mecanismos diferentes do JavaScript:

* O painel que exibe o HTML (lado da Web)
* O lado do cliente (FormIt) faz chamadas para o FormIt e seu kernel de geometria.

Esses dois mecanismos do JavaScript funcionam em processos distintos.

## **Lado do cliente (FormIt) versus lado da Web (HTML)**

O FormIt executa vários mecanismos do JavaScript simultaneamente:

* O aplicativo do FormIt tem seu próprio mecanismo de JavaScript
* Cada barra de ferramentas de plug-in tem seu próprio mecanismo de JavaScript.
* Cada painel de plug-in tem seu próprio mecanismo de JavaScript (Chromium)

Os plug-ins podem especificar onde o JavaScript é carregado:

![](/files/0xSf3SQNo5hS6kQXvFez)

### Lado do cliente (FormIt)

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

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

### Lado da Web (HTML)

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

* Os scripts do lado da Web são carregados na página da Web.
* Os scripts do lado da Web podem chamar o JavaScript do lado do cliente (FormIt) usando várias chamadas assíncronas.

## Três métodos para chamar comandos do lado do cliente (FormIt) com base em um plug-in baseado na Web:

### Método 1: FormItInterface.CallMethod

`CallMethod` usa um nome de função e os argumentos que serão executados no lado do FormIt. A função passada será chamada com o resultado da chamada de função.

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

**Prós:**

➕ Nenhum `await` necessário.

**Contras:**

➖ Um retorno de chamada é necessário para obter o resultado e é chamado de “quem sabe quando”.

➖ Os scripts são definidos em dois locais diferentes.

➖ Requer que a lógica de plug-in seja dividida em dois arquivos diferentes.

### **Método 2: FormIt.CallJS**

\***Disponível somente no FormIt 2022.1 e versões mais recentes**

O CallJS leva a função JavaScript a ser chamada no lado do FormIt e no objeto arguments.json.

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

**Prós:**

➕ O resultado está disponível quando necessário

**Contras:**

➖ \*\*\*\* É preciso decorar todas as chamadas assíncronas com await, esquecer de fazer isso complicará as coisas.

➖ \*\*\*\* Potencialmente mais lento devido a `await`

### **Método 3 (assíncrono/await)**

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

Com uma chamada assíncrona, o lado da Web chama o lado do FormIt. Essa chamada começa em um processo, é enviada para outro processo e, em seguida, o resultado é retornado ao processo inicial. É por isso que é necessário aguardar.

Somente as APIs do FormIt incorporadas podem ser chamadas por padrão.

**Prós:**

➕ O resultado está disponível quando necessário.

➕ Permite combinar todos os códigos em um arquivo JS executado na Web, sem scripts definidos no manifest.json.

**Contras:**

➖ \*\*\*\* É preciso decorar todas as chamadas assíncronas com `await`, esquecer de fazer isso complicará as coisas.

➖ \*\*\*\* Potencialmente mais lento devido a `await.`

### Método 4 (RegisterAsyncAPI)

\***Disponível somente no FormIt 2023.0 e versões mais recentes**

Para chamar uma função definida pelo usuário no lado do FormIt, a função precisa ser registrada. Por exemplo:

**Lado do cliente (FormIt)**

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

**Lado da Web (HTML)**

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

Consulte [HelloBlockAsync](https://github.com/FormIt3D/FormItExamplePlugins/tree/master/HelloBlockAsync/v23_0) para obter um exemplo.

**Prós:**

➕ O resultado está disponível quando necessário.

➕ Permite combinar todos os códigos em um arquivo JS executado na Web, sem scripts definidos no manifest.json.

**Contras:**

➖ \*\*\*\* É preciso decorar todas as chamadas assíncronas com await, esquecer de fazer isso complicará as coisas.

➖ \*\*\*\* Potencialmente mais lento devido a `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/pt-br/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.
