# Functions

Nessa sessão você pode desenvolver ações personalizadas em javascript.&#x20;

Para aplicá-la no seu assistente vá em > **configuração do nó** > componente de **ações** `ƒ` > acesse o **helper** `?`  > busque por **ação personalizada**.&#x20;

![](https://776911411-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MBjaNm5lB1Yqgih1JCA%2Fuploads%2FgZ0jkQ2aNLiYixN908oA%2FAc%CC%A7o%CC%83es%20personalizadas.png?alt=media\&token=dad04b5a-5fa3-4d6c-a05b-82f425705528)

\
Mas antes, você precisa:

* Desenvolver a ação
* Testar&#x20;
* Salvar&#x20;
* Publicar&#x20;

{% hint style="success" %}
Visite nossa área de [configuração das functions](https://docs.altu.d1.cx/build/acoes) para mais detalhes.
{% endhint %}

## Async function

O recurso Async funciona como uma função assíncrona, isto é, uma comunicação que não ocorre de forma simultânea.&#x20;

Quando essa função é chamada, ela evita pausas no sistema simplificando o uso das Functions.

### Como funciona

De maneira geral, os dados externos recebidos através de um endpoint de uma API, por exemplo, levam um tempo para que chegue ao sistema.&#x20;

Ainda que seja necessário aguardar a resposta da API, há formas de não bloquear o funcionamento do programa. Nesse sentido, **a comunicação assíncrona entra como uma opção em "segundo plano", onde o sistema pode continuar rodando enquanto executa uma tarefa**.&#x20;

### Funções assíncronas

As funções assíncronas podem ser acionadas pelas palavras-chave **async** e **await**. Ambas permitem que o comportamento assíncrono, baseado em promessas, seja escrito sem necessidade de configurar códigos de promessas extensamente.

#### Async

Para começar, inicie a escrita do código considerando a **palavra-chave** **async**.

O Async é definido no **builder**, como mostra o exemplo abaixo. Ao ser inserido, o sistema já entenderá que ele deve retornar uma ação ou promessa.

<figure><img src="https://776911411-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MBjaNm5lB1Yqgih1JCA%2Fuploads%2FxGeI7QOX9MxinvS2tYoO%2FCaptura%20de%20Tela%202023-02-07%20%C3%A0s%2010.52.01.png?alt=media&#x26;token=c133a700-9dab-46f1-846f-23c4d55ce8f7" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
O tempo máximo de execução de uma functions async será de 30 segundos.&#x20;
{% endhint %}

#### Return

A seguir, você deverá inserir o **return**, que **é a promessa esperada pela async acionada**. O retorno é caracterizado por dois valores:

* **True:** significa que o fluxo continuará e o `result_variable` é preenchido com o status *Pending*, indicando que a requisição está em andamento. Ao final da chamada da API, será enviada uma nova mensagem atualizando o resultado como *Done*, ou seja, concluída com sucesso.
* **False:** significa que **a função não possui um retorno explícito** e que a conversa iniciada ficará aguardando um retorno da function, sem seguir o fluxo configurado.

{% hint style="warning" %}
**Um valor não especificado será classificado automaticamente como false** e seguirá o mesmo padrão do `http_request`. Clique [aqui](https://docs.altu.d1.cx/build/assistentes/builder/componentes/actions/http_request) para ler mais.
{% endhint %}

#### WaitTime

O objetivo desta palavra é **aguardar a resolução de uma função assíncrona**. Ela deve ser utilizada quando há a necessidade de esperar por alguma resposta que possa demorar mais do que o tempo normal da execução do código.

Para utilizá-la, é preciso **definir a função com async** **e utilizar o WaitTime na função**, como mostra o exemplo abaixo:

<figure><img src="https://776911411-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MBjaNm5lB1Yqgih1JCA%2Fuploads%2FLUV16fw607AohpXWeQbh%2FCaptura%20de%20Tela%202023-02-07%20%C3%A0s%2011.36.20.png?alt=media&#x26;token=58af9d2c-51da-4778-ae14-c8b0c7a9b71f" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Os valores a serem utilizados devem ser em **segundos** e estar entre **0 e 900**, o que **equivale a 15 minutos**.
{% endhint %}

### Mais informações

* Quando o builder é executado em modo de **desenvolvimento**, será usada a versão de desenvolvimento da function.
* Quando o builder é executado em **homologação**, será usada a versão de homologação da function. Caso não haja uma versão de homologação, será usada a versão de desenvolvimento.
* Quando o builder é executado em **produção**, será usada a versão publicada da function. Caso a function não tenha uma versão publicada, a action vai retornar como response um JSON como esse:

```json
{
  code: 404,
  message: "Function not found or published"
}
```

{% hint style="success" %}
A execução de functions no Builder gera entradas de logs que podem ser vistas na área específica para isto da function.
{% endhint %}


---

# 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://docs.altu.d1.cx/build/assistentes/builder/componentes/actions/functions.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.
