# Do While

O **Do While** permite a construção de blocos em loop dentro de um pipeline. Ele faz parte de um conjunto de conectores que trabalham com subfluxos para executar suas funções.

## **Parâmetros**

Dê uma olhada nos parâmetros de configuração do conector. Parâmetros suportados por [expressões Double Braces](/documentation/connectors-and-triggers/pt-br/double-braces/overview.md) estão marcados com `(DB)`.

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Iteration</strong></td><td>Define o número máximo de vezes que um loop é executado (é possível interromper o loop antes que esse número seja alcançado).</td><td>10</td><td>Integer</td></tr><tr><td><strong>Timeout</strong></td><td>Tempo máximo de execução do loop.</td><td>300000</td><td>Integer</td></tr><tr><td><strong>Loop Index</strong></td><td>Se ativado, uma propriedade <code>"loopIndex"</code> será inserida na mensagem apresentada em cada iteração do loop, informando o índice atual da iteração (1, 2, 3, …).</td><td>False</td><td>Booleano</td></tr><tr><td><strong>Interrupt Loop On Error</strong></td><td>Se ativado, um erro ocorrido dentro de uma iteração interromperá o loop como um todo. Caso contrário, o loop continuará a partir da próxima iteração.</td><td>True</td><td>Booleano</td></tr></tbody></table>

## **Definição do subfluxo a ser executado em cada iteração**

Para trabalhar com esse tipo de conector, é importante considerar:

* **Subfluxo definido no bloco onProcess:** o pipeline definido nesse bloco é executado a cada iteração do loop. Assim, se o loop tiver 10 iterações, o subfluxo será executado 10 vezes.
* **Subfluxo definido no bloco onException:** o pipeline definido nesse bloco será executado sempre que uma iteração do loop resultar em erro.

Para definir o subfluxo a ser executado em cada iteração, basta clicar no ícone **onProcess** do conector **Do While**:

<figure><img src="/files/304vDXKSYFAjIDm64yJR" alt=""><figcaption></figcaption></figure>

Ao clicar nesse ícone, um subfluxo será criado (ou exibido, caso já exista). Depois, basta construir o fluxo desejado de acordo com a necessidade de execução de cada iteração.

{% hint style="warning" %}
A entrada desse pipeline será alimentada com a mensagem que vem antes do **Do While**. Isso ocorrerá na execução do loop #1. Para as demais iterações, a mensagem apresentada será a mensagem final da iteração anterior e assim sucessivamente. Se o **Loop Index** estiver ativado, uma propriedade `loopIndex` será inserida na mensagem, informando a iteração atual.
{% endhint %}

## **Interrompendo um loop**

Para interromper um loop antes do número máximo de iterações definidas, basta informar a propriedade `"loopBreak: true"` no final da iteração. Se a propriedade for encontrada, o loop será interrompido.

Uma forma de informar essa propriedade é usando o conector [**JSON Generator**](/documentation/connectors-and-triggers/pt-br/connectors/tools/json-generator.md), que permite definir JSONs arbitrários no fluxo do pipeline.

{% hint style="info" %}
Quando a propriedade `loopBreak: true` é usada, a saída do conector ficará vazia. Para facilitar a localização dessa propriedade no seu fluxo, recomendamos nomear o conector como **"loopBreak"**. Assim, você pode identificar rapidamente onde o loop foi interrompido ao analisar a execução.
{% endhint %}

## **Tratamento de erros no loop**

O comportamento padrão do **Do While** é interromper o loop caso ocorra um erro. Erros são situações atípicas na execução de um pipeline que resultam na sua interrupção. Por exemplo, o uso de um conector **Assert** gera um erro no pipeline quando a condição da asserção não é atendida. Outras situações de erro ocorrem quando conectores são utilizados com a configuração **Fail On Error** ativada.

Conforme explicado anteriormente, é possível definir um subfluxo para tratar erros. A definição desse subfluxo é feita através do ícone **onException** do conector **Do While**:

<figure><img src="/files/ouhRLGwiZK3bxUQZV1nX" alt=""><figcaption></figcaption></figure>

A entrada desse subfluxo será alimentada com uma mensagem de erro, que informará o que ocorreu na iteração e o índice da iteração (`loopIndex`) que causou a falha.

```json
{
  "timestamp": <timestamp do erro>,
  "error": <mensagem de erro>,
  "code": 500,
  "loopIndex": <índice da iteração onde ocorreu o erro>
}
```

## **Cenários de uso do conector Do While com tratamento de erros**

### **Propriedade "Interrupt Loop On Error" ativada e nenhum subfluxo definido em onException**

* O subfluxo será imediatamente interrompido;
* Um erro será lançado pelo conector **Do While**;
* Nenhum outro conector será invocado após o **Do While**.

### **Propriedade "Interrupt Loop On Error" ativada e um subfluxo definido em onException**

* O subfluxo será imediatamente interrompido;
* O subfluxo definido em **onException** será executado, e sua saída alimentará o conector seguinte ao **Do While**;
* O conector seguinte ao **Do While** será invocado.

### **Propriedade "Interrupt Loop On Error" desativada e nenhum subfluxo definido em onException**

* A iteração onde ocorreu o erro será interrompida;
* Uma mensagem de erro padrão será informada na entrada da próxima iteração, e o loop continuará normalmente.

### **Propriedade "Interrupt Loop On Error" desativada e um subfluxo definido em onException**

* A iteração onde ocorreu o erro será interrompida;
* O subfluxo definido em **onException** será executado, e sua saída alimentará a próxima iteração;
* O loop continuará normalmente.

## **Erro durante a execução do subfluxo onException**

* O loop será interrompido;
* O erro será lançado para o próximo conector ao qual o **Do While** está associado;
* Se o **Do While** estiver no fluxo principal do pipeline, então o pipeline será interrompido;
* Se o **Do While** estiver dentro de um conector que possui um subfluxo, então o subfluxo **onException** será invocado, e o erro será informado na entrada desse pipeline.


---

# 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.digibee.com/documentation/connectors-and-triggers/pt-br/connectors/logic/do-while.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.
