# 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](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/double-braces/overview) 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="https://content.gitbook.com/content/SKBJ6ZiEWBU93x170HH4/blobs/vv3G46Mz0iUs6u255FRF/Do%20While%20onprocess%20nov%2023.png" 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**](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/connectors/tools/json-generator), 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="https://content.gitbook.com/content/SKBJ6ZiEWBU93x170HH4/blobs/aAdakSsdnBDkDSkOKbw0/Do%20While%20onexception%20nov%2023.png" 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.
