Skip to content

Instantly share code, notes, and snippets.

@IanRamosC
Forked from VictorTaelin/promises.md
Created August 31, 2017 02:59
Show Gist options
  • Select an option

  • Save IanRamosC/e4676b6c2275f51e7751e5b9caf08d8f to your computer and use it in GitHub Desktop.

Select an option

Save IanRamosC/e4676b6c2275f51e7751e5b9caf08d8f to your computer and use it in GitHub Desktop.

Revisions

  1. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -130,10 +130,10 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

     // combina os promises em um único promise em paralelo
     // combine os promises em um único promise em paralelo
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

      // aí sim usa await
      // aí sim use await
      var [blabla1, blabla2, blabla3] = await allBlablas_p;

    console.log(blabla1, blabla2, blabla3);
  2. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -139,7 +139,7 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    console.log(blabla1, blabla2, blabla3);

    } catch (error) {
    // handle error
    // seja educado e trate os erros corretamente
    }

    })();
  3. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 20 additions and 14 deletions.
    34 changes: 20 additions & 14 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -118,23 +118,29 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma

    3. sempre que fizer uma chamada assincrona numa função `async`, coloque `await` antes

    4. bonus: se suas chamadas async puderem ser feitas em paralelo, use `Promise.all`. ex:
    4. bonus: A. use `try/catch`. B. se suas chamadas async puderem ser feitas em paralelo, use `Promise.all`. ex:

    ```javascript
    (async () => {

     // não vamos usar await ainda
     var blabla1_p = request("blabla1");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

     // combina os promises em um único promise em paralelo
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

     // aí sim usa await
     var [blabla1, blabla2, blabla3] = await allBlablas_p;

    console.log(blabla1, blabla2, blabla3);

    try {

      // não vamos usar await ainda
      var blabla1_p = request("blabla1");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

     // combina os promises em um único promise em paralelo
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

      // aí sim usa await
      var [blabla1, blabla2, blabla3] = await allBlablas_p;

    console.log(blabla1, blabla2, blabla3);

    } catch (error) {
    // handle error
    }

    })();
    ```
  4. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -141,4 +141,4 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma

    esse último código seria a melhor versão dessa nossa função

    5. [para Haskellers: Promises são monads, `.then` é o `>>=`, e `async\await` é o `do {}`](https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80)
    5. para Haskellers: [Promises são monads, `.then` é o `>>=`, e `async\await` é o `do {}`](https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80)
  5. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -125,16 +125,16 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma

     // não vamos usar await ainda
     var blabla1_p = request("blabla1");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

     // combina os promises em um único promise em paralelo
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

     // aí sim usa await
     var [blabla1, blabla2, blabla3] = await allBlablas_p;

    console.log(blabla1, blabla2, blabla3);
    console.log(blabla1, blabla2, blabla3);

    })();
    ```
  6. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -141,4 +141,4 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma

    esse último código seria a melhor versão dessa nossa função

    5. para uma explicação mais elaborada, clique [aqui](https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80)
    5. [para Haskellers: Promises são monads, `.then` é o `>>=`, e `async\await` é o `do {}`](https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80)
  7. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -137,7 +137,7 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    console.log(blabla1, blabla2, blabla3);

    })();
    ```
    ```

    esse último código seria a melhor versão dessa nossa função

  8. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 19 additions and 19 deletions.
    38 changes: 19 additions & 19 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -119,26 +119,26 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    3. sempre que fizer uma chamada assincrona numa função `async`, coloque `await` antes

    4. bonus: se suas chamadas async puderem ser feitas em paralelo, use `Promise.all`. ex:

    ```javascript
    (async () => {

     // não vamos usar await ainda
     var blabla1_p = request("blabla1");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

     // combina os promises em um único promise em paralelo
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

     // aí sim usa await
     var [blabla1, blabla2, blabla3] = await allBlablas_p;

    console.log(blabla1, blabla2, blabla3);

    })();
    ```javascript
    (async () => {

     // não vamos usar await ainda
     var blabla1_p = request("blabla1");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

     // combina os promises em um único promise em paralelo
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

     // aí sim usa await
     var [blabla1, blabla2, blabla3] = await allBlablas_p;

    console.log(blabla1, blabla2, blabla3);

    })();
    ```

    esse último código seria a melhor versão dessa nossa função
    esse último código seria a melhor versão dessa nossa função

    5. para uma explicação mais profunda, clique [aqui](https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80)
    5. para uma explicação mais elaborada, clique [aqui](https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80)
  9. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 3 additions and 1 deletion.
    4 changes: 3 additions & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -139,4 +139,6 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    })();
    ```

    esse último código seria a melhor versão dessa nossa função
    esse último código seria a melhor versão dessa nossa função

    5. para uma explicação mais profunda, clique [aqui](https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb1376c80)
  10. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -129,10 +129,10 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    var blabla3_p = request("blabla3");

     // combina os promises em um único promise em paralelo
    var allBlablas = Promise.all([blabla1_p, blabla2_p, blabla3_p]);
    var allBlablas_p = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

     // aí sim usa await
     var [blabla1, blabla2, blabla3] = await allBlablas;
     var [blabla1, blabla2, blabla3] = await allBlablas_p;

    console.log(blabla1, blabla2, blabla3);

  11. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -63,7 +63,7 @@ request("blabla1")

    como vc pode ver, o primeiro é uma bosta de ler, e o segundo traz o mesmo problema dos callbacks. a solução definitiva disso é o `async/await`.

    PS: nesse caso vc poderia usar `Promise.all`, mas não poderia se os requests dependessem dos valores dos blablas intermediários. o ponto é: `.then` não resolve todos os casos
    PS: nesse caso vc poderia usar `Promise.all` nos 3 requests logo no início, mas não daria pra fazer isso se os requests dependessem dos valores dos blablas intermediários. o ponto é: `.then` não resolve todos os casos

    ### async: simplificando promises

  12. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -118,7 +118,7 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma

    3. sempre que fizer uma chamada assincrona numa função `async`, coloque `await` antes

    4. se suas chamadas assíncronas puderem ser feitas em paralelo, use `Promise.all`. ex:
    4. bonus: se suas chamadas async puderem ser feitas em paralelo, use `Promise.all`. ex:

    ```javascript
    (async () => {
  13. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -63,7 +63,7 @@ request("blabla1")

    como vc pode ver, o primeiro é uma bosta de ler, e o segundo traz o mesmo problema dos callbacks. a solução definitiva disso é o `async/await`.

    PS: nesse caso vc poderia usar `Promise.all`, mas não poderia se os requests dependessem dos valores dos blablas intermediários. o ponto é: promises não resolvem todos os casos
    PS: nesse caso vc poderia usar `Promise.all`, mas não poderia se os requests dependessem dos valores dos blablas intermediários. o ponto é: `.then` não resolve todos os casos

    ### async: simplificando promises

  14. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 3 additions and 1 deletion.
    4 changes: 3 additions & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -20,7 +20,7 @@ request("blabla1", function callback(blabla1) {

    ### promises: simplificando funcões assíncronas

    eventualmente inventaram promises, que são "valores que serão resolvidos futuramente". eles podem ser passados por aí como valores normais de JS, e vc pode usar `.then(...)` para "esperar" o resultado. além do que, eles podem ser encadeados. cada `.then` tem acesso ao valor retornado pelo then anterior. por fim, vc pode capturar todos os erros no final da cadeia, com um `.catch`.
    eventualmente inventaram promises, que são "valores que serão resolvidos futuramente". eles podem ser passados por aí como valores normais de JS, e vc pode usar `.then(...)` para "esperar" o resultado. além do que, eles podem ser encadeados. cada `.then` tem acesso ao valor retornado pelo `.then` anterior. por fim, vc pode capturar todos os erros no final da cadeia, com um `.catch`.

    ```javascript
    request("blabla1")
    @@ -63,6 +63,8 @@ request("blabla1")

    como vc pode ver, o primeiro é uma bosta de ler, e o segundo traz o mesmo problema dos callbacks. a solução definitiva disso é o `async/await`.

    PS: nesse caso vc poderia usar `Promise.all`, mas não poderia se os requests dependessem dos valores dos blablas intermediários. o ponto é: promises não resolvem todos os casos

    ### async: simplificando promises

    asyncs funcionam junto com Promises. basicamente, toda função que tem `async` retorna um promise. por ex:
  15. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -126,7 +126,7 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

     // combina os requests em um único request em paralelo
     // combina os promises em um único promise em paralelo
    var allBlablas = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

     // aí sim usa await
  16. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 7 additions and 3 deletions.
    10 changes: 7 additions & 3 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -121,12 +121,16 @@ o compilador adiciona as identações automaticamente, e o código fica muito ma
    ```javascript
    (async () => {

    var blabla1_p = request("blabla1");
     // não vamos usar await ainda
     var blabla1_p = request("blabla1");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

    // faz os requests acima em paralelo
    var [blabla1, blabla2, blabla3] = Promise.all([blabla1_p, blabla2_p, blabla3_p]);
     // combina os requests em um único request em paralelo
    var allBlablas = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

     // aí sim usa await
     var [blabla1, blabla2, blabla3] = await allBlablas;

    console.log(blabla1, blabla2, blabla3);

  17. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 27 additions and 0 deletions.
    27 changes: 27 additions & 0 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -107,3 +107,30 @@ request("blabla1")
    ```

    o compilador adiciona as identações automaticamente, e o código fica muito mais normal e legível.

    ### resumo

    1. nao use `.then`

    2. se a função que vc está escrevendo vai usar algo assíncrono, comece ela com `async`

    3. sempre que fizer uma chamada assincrona numa função `async`, coloque `await` antes

    4. se suas chamadas assíncronas puderem ser feitas em paralelo, use `Promise.all`. ex:

    ```javascript
    (async () => {

    var blabla1_p = request("blabla1");
    var blabla2_p = request("blabla2");
    var blabla3_p = request("blabla3");

    // faz os requests acima em paralelo
    var [blabla1, blabla2, blabla3] = Promise.all([blabla1_p, blabla2_p, blabla3_p]);

    console.log(blabla1, blabla2, blabla3);

    })();
    ```

    esse último código seria a melhor versão dessa nossa função
  18. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -39,7 +39,7 @@ request("blabla1")
    .then(blabla3 => console.log(blabla1, blabla2, blabla3)) // imprime todos os blablas
    ```

    pára um tempo pra ler o codigo acima e se vê o erro. `blabla1` e `blabla2` não estão em escopo no ultimo `then`! tem 2 jeitos de resolver isso:
    pára um tempo pra ler o codigo acima e perceba o erro. `blabla1` e `blabla2` não estão em escopo no ultimo `then`! tem 2 jeitos de resolver isso:

    1. passa os blablas adiante, até chegar no ultimo then:

  19. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    ### o pq de funcões assíncronas

    funcoes de javascript quase sempre são assincronas. isso acontece porque js lida muito com coisas como http requests, leitura de disco... operacoes que levam muito tempo. imagina se seu programa travasse toda vez que vc fizesse um request http? pra evitar isso, o request é feito, o programa continua rodando, e depois o resultado é enviado pra vc num callback
    funcoes de javascript quase sempre são assincronas. isso acontece porque js lida muito com coisas como http requests, leitura de disco... operacoes que levam muito tempo. imagina se seu programa travasse toda vez que vc fizesse um request http? pra evitar isso, o request é feito em background, o programa continua rodando, e depois o resultado é enviado pra vc num callback

    ```javascript
    request("www.google.com", function callback(resultado) { ... })
  20. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 12 additions and 1 deletion.
    13 changes: 12 additions & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -95,4 +95,15 @@ repara que `async` é só um shortcut para escrever uma função que retorna um
    })();
    ```

    esse código é equivalente aquela solução de identadar os promises pra direita. o compilador adiciona as identações automaticamente, e o código fica muito mais normal e legível.
    esse código é equivalente a esse:

    ```javascript
    request("blabla1")
    .then(blabla1 => request("blabla2")
    .then(blabla2 => request("blabla3")
    .then(blabla3 => console.log(blabla1, blabla2, blabla3)) // imprime todos os blablas
    )
    );
    ```

    o compilador adiciona as identações automaticamente, e o código fica muito mais normal e legível.
  21. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion promises.md
    Original file line number Diff line number Diff line change
    @@ -81,7 +81,7 @@ const add = async (a, b) => a + b;
    add(1, 2).then(result => console.log(result)); // imprime 3
    ```

    repara que `async` é só um shortcut para escrever uma função que retorna um promise. mas o legal é que, dentro de uma função `async`, vc pode usar `await promise`, que *para a execução da função até que o promise resolva*. repare que isso não é um problema, pois, como a função é assincrona, isso não vai "travar o seu programa" (o que aconteceria se o `await` pudesse ser usado em funções normais!). assim, com o `async/await`, você consegue escrever funções assíncronas com a "mesma cara" de funções normais.
    repara que `async` é só um shortcut para escrever uma função que retorna um promise. mas o legal é que, dentro de uma função `async`, vc pode usar `await promise`, que **pára a execução da função até que o promise resolva**. repare que isso não é um problema, pois, como a função é assincrona, isso não vai "travar o seu programa" (o que aconteceria se o `await` pudesse ser usado em funções normais!). só vai travar a própria função, que roda em background, então tanto faz. assim, com o `async/await`, você consegue escrever funções assíncronas com a "mesma cara" de funções normais.

    ```javascript
    (async () => {
  22. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 6 additions and 4 deletions.
    10 changes: 6 additions & 4 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -6,7 +6,7 @@ funcoes de javascript quase sempre são assincronas. isso acontece porque js lid
    request("www.google.com", function callback(resultado) { ... })
    ```

    isso é bom, mas gerava codigo dificil de ler, porque virava uma arvode de identação:
    isso é bom pra performance, mas gera codigo dificil de ler, porque vira uma arvode de identação:

    ```javascript
    request("blabla1", function callback(blabla1) {
    @@ -20,7 +20,7 @@ request("blabla1", function callback(blabla1) {

    ### promises: simplificando funcões assíncronas

    daí inventaram promises, que são "valores que serão resolvidos futuramente". eles podem ser passados por aí como valores normais de JS, e vc pode usar `.then(...)` para "esperar" o resultado. além do que, eles podem ser encadeados. cada `.then` tem acesso ao valor retornado pelo then anterior. por fim, vc pode capturar todos os erros no final da cadeia, com um `.catch`.
    eventualmente inventaram promises, que são "valores que serão resolvidos futuramente". eles podem ser passados por aí como valores normais de JS, e vc pode usar `.then(...)` para "esperar" o resultado. além do que, eles podem ser encadeados. cada `.then` tem acesso ao valor retornado pelo then anterior. por fim, vc pode capturar todos os erros no final da cadeia, com um `.catch`.

    ```javascript
    request("blabla1")
    @@ -50,7 +50,7 @@ request("blabla1")
    .then(([blabla1, blabla2, blabla3]) => console.log(blabla1, blabla2, blabla3)) // imprime todos os blablas
    ```

    2. identar para a direita:
    2. identa para a direita:

    ```javascript
    request("blabla1")
    @@ -61,9 +61,11 @@ request("blabla1")
    );
    ```

    como vc pode ver, o primeiro é uma bosta de ler, e o segundo traz o mesmo problema dos callbacks. a solução definitiva disso é o `async/await`.

    ### async: simplificando promises

    como vc pode ver, o primeiro é uma bosta de ler, e o segundo traz o mesmo problema dos callbacks. a solução definitiva disso é o `async/await`. eles funcionam junto com Promises. basicamente, toda função que tem `async` retorna um promise. por ex:
    asyncs funcionam junto com Promises. basicamente, toda função que tem `async` retorna um promise. por ex:

    ```javascript
    const add = (a, b) => new Promise((resolve, reject) => resolve(a + b));
  23. @VictorTaelin VictorTaelin revised this gist Aug 31, 2017. 1 changed file with 9 additions and 5 deletions.
    14 changes: 9 additions & 5 deletions promises.md
    Original file line number Diff line number Diff line change
    @@ -1,11 +1,12 @@
    ### o pq de funcões assíncronas

    ate pela natureza do JS, funcoes geralmente eram assincronas. escrever no disco, etc. no começo, se usava callbacks:
    funcoes de javascript quase sempre são assincronas. isso acontece porque js lida muito com coisas como http requests, leitura de disco... operacoes que levam muito tempo. imagina se seu programa travasse toda vez que vc fizesse um request http? pra evitar isso, o request é feito, o programa continua rodando, e depois o resultado é enviado pra vc num callback

    ```javascript
    request("www.google.com", function callback(resultado) { ... })
    ```

    depois, constataram que isso era burrice e gerava codigo dificil de ler, porque virava uma arvode de identação:
    isso é bom, mas gerava codigo dificil de ler, porque virava uma arvode de identação:

    ```javascript
    request("blabla1", function callback(blabla1) {
    @@ -17,8 +18,9 @@ request("blabla1", function callback(blabla1) {
    })
    ```

    ### promises: simplificando funcões assíncronas

    inventaram promises, que são "valores que serão resolvidos futuramente". eles podem ser passados por aí como valores normais de JS, e vc pode usar `.then(...)` para "esperar" o resultado. além do que, eles podem ser encadeados. cada `.then` tem acesso ao valor retornado pelo then anterior. por fim, vc pode capturar todos os erros no final da cadeia, com um `.catch`, o que simplifica ainda mais alguns codigos.
    daí inventaram promises, que são "valores que serão resolvidos futuramente". eles podem ser passados por aí como valores normais de JS, e vc pode usar `.then(...)` para "esperar" o resultado. além do que, eles podem ser encadeados. cada `.then` tem acesso ao valor retornado pelo then anterior. por fim, vc pode capturar todos os erros no final da cadeia, com um `.catch`.

    ```javascript
    request("blabla1")
    @@ -28,7 +30,7 @@ request("blabla1")
    .catch(error => ...) // uma vez so, captura todos os erros acima!
    ```

    esse estilo permite simplificar muito o codigo, mas ainda é meio bosta. imagina que vc precisa de todos os `blablas` na ultima linha?
    esse estilo permite simplificar muito códigos assíncronos, mas ainda é meio bosta. imagina que vc precisa de todos os `blablas` na ultima linha?

    ```javascript
    request("blabla1")
    @@ -37,7 +39,7 @@ request("blabla1")
    .then(blabla3 => console.log(blabla1, blabla2, blabla3)) // imprime todos os blablas
    ```

    para um tempo pra ler o codigo acima e se vê o erro. `blabla1` e `blabla2` não estão em escopo no ultimo then! tem 2 jeitos de resolver isso:
    pára um tempo pra ler o codigo acima e se vê o erro. `blabla1` e `blabla2` não estão em escopo no ultimo `then`! tem 2 jeitos de resolver isso:

    1. passa os blablas adiante, até chegar no ultimo then:

    @@ -59,6 +61,8 @@ request("blabla1")
    );
    ```

    ### async: simplificando promises

    como vc pode ver, o primeiro é uma bosta de ler, e o segundo traz o mesmo problema dos callbacks. a solução definitiva disso é o `async/await`. eles funcionam junto com Promises. basicamente, toda função que tem `async` retorna um promise. por ex:

    ```javascript
  24. @VictorTaelin VictorTaelin renamed this gist Aug 31, 2017. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  25. @VictorTaelin VictorTaelin created this gist Aug 31, 2017.
    92 changes: 92 additions & 0 deletions promises.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,92 @@

    ate pela natureza do JS, funcoes geralmente eram assincronas. escrever no disco, etc. no começo, se usava callbacks:

    ```javascript
    request("www.google.com", function callback(resultado) { ... })
    ```

    depois, constataram que isso era burrice e gerava codigo dificil de ler, porque virava uma arvode de identação:

    ```javascript
    request("blabla1", function callback(blabla1) {
    request("blabla2", function callback(blabla2) {
    request("blabla3", function callback(blabla3) {
    console.log(blabla3); // imprime o ultimo blabla
    })
    })
    })
    ```


    inventaram promises, que são "valores que serão resolvidos futuramente". eles podem ser passados por como valores normais de JS, e vc pode usar `.then(...)` para "esperar" o resultado. além do que, eles podem ser encadeados. cada `.then` tem acesso ao valor retornado pelo then anterior. por fim, vc pode capturar todos os erros no final da cadeia, com um `.catch`, o que simplifica ainda mais alguns codigos.

    ```javascript
    request("blabla1")
    .then(blabla1 => request("blabla2"))
    .then(blabla2 => request("blabla3"))
    .then(blabla3 => console.log(blabla3)) // imprime o ultimo blabla
    .catch(error => ...) // uma vez so, captura todos os erros acima!
    ```

    esse estilo permite simplificar muito o codigo, mas ainda é meio bosta. imagina que vc precisa de todos os `blablas` na ultima linha?

    ```javascript
    request("blabla1")
    .then(blabla1 => request("blabla2"))
    .then(blabla2 => request("blabla3"))
    .then(blabla3 => console.log(blabla1, blabla2, blabla3)) // imprime todos os blablas
    ```

    para um tempo pra ler o codigo acima e se o erro. `blabla1` e `blabla2` não estão em escopo no ultimo then! tem 2 jeitos de resolver isso:
    1. passa os blablas adiante, até chegar no ultimo then:
    ```javascript
    request("blabla1")
    .then(blabla1 => Promise.all([blabla1, request("blabla2")]))
    .then(([blabla1, blabla2]) => Promise.all([blabla1, blabla2, request("blabla3")]))
    .then(([blabla1, blabla2, blabla3]) => console.log(blabla1, blabla2, blabla3)) // imprime todos os blablas
    ```
    2. identar para a direita:
    ```javascript
    request("blabla1")
    .then(blabla1 => request("blabla2")
    .then(blabla2 => request("blabla3")
    .then(blabla3 => console.log(blabla1, blabla2, blabla3)) // imprime todos os blablas
    )
    );
    ```
    como vc pode ver, o primeiro é uma bosta de ler, e o segundo traz o mesmo problema dos callbacks. a solução definitiva disso é o `async/await`. eles funcionam junto com Promises. basicamente, toda função que tem `async` retorna um promise. por ex:
    ```javascript
    const add = (a, b) => new Promise((resolve, reject) => resolve(a + b));

    add(1, 2).then(result => console.log(result)); // imprime 3
    ```
    isso pode ser reescrito como:
    ```javascript
    const add = async (a, b) => a + b;

    add(1, 2).then(result => console.log(result)); // imprime 3
    ```
    repara que `async` é só um shortcut para escrever uma função que retorna um promise. mas o legal é que, dentro de uma função `async`, vc pode usar `await promise`, que *para a execução da função até que o promise resolva*. repare que isso não é um problema, pois, como a função é assincrona, isso não vai "travar o seu programa" (o que aconteceria se o `await` pudesse ser usado em funções normais!). assim, com o `async/await`, você consegue escrever funções assíncronas com a "mesma cara" de funções normais.
    ```javascript
    (async () => {

    var blabla1 = await request("blabla1");
    var blabla2 = await request("blabla2");
    var blabla3 = await request("blabla3");

    console.log(blabla1, blabla2, blabla3);

    })();
    ```

    esse código é equivalente aquela solução de identadar os promises pra direita. o compilador adiciona as identações automaticamente, e o código fica muito mais normal e legível.