Promises no ReactPHP \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 01 Horas 

 22 Min 

 08 Seg 

   Tempo restante da oferta: 01 22 08 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Promises no ReactPHP  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# Promises no ReactPHP

 Dando continuidade aos artigos sobre programação assíncrona com PHP, neste artigo veremos o componente do ReactPHP para trabalharmos com Promises.

 [ Kennedy Tedesco ](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco) 8 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/01125223/react-php-imagem.png)  

No último artigo - [Introdução à programação assíncrona em PHP usando o ReactPHP](https://www.treinaweb.com.br/blog/introducao-a-programacao-assincrona-em-php-usando-o-reactphp/) - tivemos uma introdução à programação assíncrona com [PHP](https://www.treinaweb.com.br/blog/o-que-e-php/ "PHP").

No artigo de hoje vamos comentar sobre *Promises*, que no ReactPHP trata-se de um [componente](https://github.com/reactphp/promise). *Promises* no ReactPHP são uma implementação da API [CommonJS Promises/A](http://wiki.commonjs.org/wiki/Promises/A). Se você trabalha com JavaScript, vai notar muita similaridade com o que veremos a seguir.

[  ![Doctrine ORM - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/doctrine.svg)   Curso Doctrine ORM - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/doctrine-orm-fundamentos)

## Afinal, o que é uma Promise?

Uma *Promise* é uma abstração que encapsula um resultado de uma execução assíncrona para ser utilizado quando ele estiver disponível. *Promises* desempenham a mesma tarefa que os *Callbacks* dos quais já estamos acostumados, só que de maneira bem mais elegante (principalmente quando lidamos com múltiplos *callbacks* de forma encadeada).

Dois conceitos importantes que temos que conhecer: *Promise* e *Deferred*. Já vimos que uma **Promise** representa o resultado de um código assíncrono, já **Deferred** representa a computação que vai gerar esse resultado em algum momento futuro. Um objeto *Deferred* sempre vai ter uma *Promise* associada que vai representar (encapsular) o resultado. Usar um objeto *Deferred* é uma forma de separar a *Promise* de quem vai resolvê-la ou rejeitá-la (em algum momento futuro).

Uma **Promise** possui três estados possíveis:

- **unfulfilled**: É o estado inicial, pois o valor retornado de *Deferred* ainda é desconhecido.
- **fulfilled**: Esse estado indica que a *Promise* está devidamente *“alimentada”* do resultado da computação de *Deferred*.
- **failed**: Houve uma exceção durante a execução do *Deferred* (o executor pode ter chamado `reject()`).

Já um objeto **Deferred** possui dois métodos para mudar o estado da sua *Promise*:

- **resolve(string $result)**: Quando o código é executado com sucesso, esse método altera o estado da *Promise* para *fulfilled* (enviando para ela o resultado que ela encapsulára);
- **reject(string $reason)**: A execução do código falhou, altera o estado da *Promise* para *failed*.

Uma *Promise* também possui métodos para que definamos *handlers* (*callbacks* a serem executados) para as mudanças de estados dela, são esses: *then()*, *done()*, *otherwise()* e *always()*.

Antes de iniciarmos, certifique-se de instalar o componente *React Promise* no seu projeto:

```bash
$ composer require react/promise

```

Vamos então ao primeiro exemplo do uso de um objeto *Deferred* e de sua *Promise*:

```php
