﻿{"id":282,"date":"2019-10-14T23:15:33","date_gmt":"2019-10-15T02:15:33","guid":{"rendered":"https:\/\/blog.softmakers.com.br\/?p=282"},"modified":"2020-04-23T16:57:33","modified_gmt":"2020-04-23T19:57:33","slug":"como-trabalhar-com-async-await-e-entendendo-promises","status":"publish","type":"post","link":"https:\/\/blog.softmakers.com.br\/index.php\/2019\/10\/14\/como-trabalhar-com-async-await-e-entendendo-promises\/","title":{"rendered":"Como trabalhar com Async \/ Await e entendendo Promises."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Entenda como trabalhar com Async\/Await <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Promises<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de falar sobre async \/ await \u00e9 preciso entender Promises.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Promises JavaScript<\/strong>.&nbsp;<strong>Promise<\/strong>, ou Promessa, \u00e9 um objeto usado para processamento <strong>ass\u00edncrono<\/strong>.  <br>Uma <strong>Promise<\/strong>&nbsp;representa um valor que pode estar dispon\u00edvel agora, no futuro ou nunca. <br>Usando uma <strong>Promise<\/strong>, \u00e9 assegurado que a <strong>API<\/strong> n\u00e3o ser\u00e1 processada nem formatada at\u00e9 que a chamada da <strong>API<\/strong> seja bem sucedida. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong> Estados de uma&nbsp;Promise&nbsp;: <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>pending<\/strong> (pendente):&nbsp;Estado inicial, que n\u00e3o foi realizada nem rejeitada. <\/li><li><strong>fulfilled<\/strong> (realizada): sucesso na opera\u00e7\u00e3o. <\/li><li><strong>rejected<\/strong> (rejeitado): &nbsp;falha na opera\u00e7\u00e3o. <\/li><li><strong>settled<\/strong> (estabelecida): Que foi realizada ou rejeitada. <\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"> <strong>Fun\u00e7\u00e3o ass\u00edncrona com Promises.<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const fetch = require('node-fetch')\n\nfunction getPerson(id){\n\tfetch(`http:\/\/swapi.co\/api\/people\/${id}`)\n\t\t.then(response => response.json())\n\t\t.then(person => console.log(person.name))\n}\n\ngetPerson(1) \/\/Luke Skywalker<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>NOTA:<\/p><p> As fun\u00e7\u00f5es&nbsp;<code>resolve<\/code>&nbsp;e&nbsp;<code>reject<\/code>, quando chamadas,&nbsp;<em>resolvem&nbsp;<\/em>(em caso de&nbsp;sucesso)ou&nbsp;<em>rejeitam&nbsp;<\/em>(quando ocorre um erro)a promessa, respectivamente.&nbsp;O executor&nbsp;come\u00e7a o trabalho ass\u00edncrono que, quando conclu\u00eddo, chama uma das&nbsp;fun\u00e7\u00f5es&nbsp;<code>resolve<\/code>&nbsp;ou&nbsp;<code>reject<\/code>&nbsp;para definir o estado da promessa. <\/p><cite>Refer\u00eancia:  <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Promise\">https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Promise<\/a> <\/cite><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Async<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A declara\u00e7\u00e3o&nbsp;<strong>async function<\/strong> define uma fun\u00e7\u00e3o ass\u00edncrona, que retorna um objeto <strong>AsyncFunction<\/strong>, em JavaScript a fun\u00e7\u00e3o ass\u00edncrona \u00e9 por defini\u00e7\u00e3o um objeto do tipo <strong>AsyncFunction<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para se obter melhor efici\u00eancia \u00e9 recomendado que a fun\u00e7\u00e3o seja declarada com o <strong>async<\/strong>, ou seja, com a <strong>expression async functions<\/strong> chamado no c\u00f3digo, desta forma as fun\u00e7\u00f5es s\u00e3o tratadas com o resto do c\u00f3digo, pois o mesmo sendo criado atrav\u00e9s do construtor <strong>AsyncFunction<\/strong> as fun\u00e7\u00f5es s\u00e3o tratados na criada, perdendo efici\u00eancia. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo<\/strong> <strong>1 :<\/strong> <strong>Declarando uma fun\u00e7\u00e3o async apartir da expression async functions.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">async function newFunction(\"\/*... Parametros *\/\") {\n    \/*... Declara\u00e7\u00f5es ... *\/\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo 2 : Declarando uma fun\u00e7\u00e3o async atrav\u00e9s do construtor de uma AsyncFuntion<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">let AsyncFunction = Object.getPrototypeOf(async function(){}).constructor\n\nlet newFunction = new AsyncFunction(\/*Aqui \u00e9 aplicado todo escopo da fun\u00e7\u00e3o, par\u00e2metros, declara\u00e7\u00f5es, retorno.*\/)\n\nnewFunction('\/* Par\u00e2metros *\/').then(v => {\n  console.log(v); \/\/ imprime o resultado.\n})<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Observamos Claramente que o Exemplo 1 n\u00e3o s\u00f3 \u00e9 mais pr\u00e1tico, como \u00e9 \u00e9 simples e de aplicar e entendimento.<\/li><\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>NOTA:<\/p><p> Uma <strong>fun\u00e7\u00e3o ass\u00edncrona <\/strong>pode conter&nbsp;uma express\u00e3o <strong>await<\/strong>, que pausa a execu\u00e7\u00e3o da <strong>fun\u00e7\u00e3o ass\u00edncrona<\/strong> e espera pela resolu\u00e7\u00e3o da <strong>Promise <\/strong>passada, e depois retorna o valor resolvido.  <\/p><cite>Refer\u00eancia:  <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Operators\/async_function\">https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Operators\/async_function<\/a> <\/cite><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Await<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O operador&nbsp;<strong>await<\/strong>&nbsp;\u00e9 utilizado para esperar por uma <strong>Promise<\/strong> . Ele pode ser usado apenas dentro de um escopo <strong>async&nbsp;function<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A express\u00e3o <strong>await<\/strong>, como o pr\u00f3prio nome diz <em><strong>&#8220;Aguardando&#8221;<\/strong><\/em>,<strong><em> <\/em><\/strong>ou seja, enquanto o processo n\u00e3o obtiver retorno a fun\u00e7\u00e3o <strong>async <\/strong>fica em pausa, esperando o retorno da <strong>Promise<\/strong>, se a <strong>Promise <\/strong>for rejeitada a express\u00e3o  <strong>await<\/strong> executa uma <em>Exception <\/em>com o valor da Rejei\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">async function newFunction() {\n\ttry{\n\t\treturn await Promisefunction('\/* parametros *\/')\n\t}catch(e){\n\t\treturn e\n\t}\n}\nconsole.log(newFunction())<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>NOTA:<\/p><p>  Se o valor n\u00e3o for uma&nbsp;<code>Promise<\/code>, ele converte o valor para uma&nbsp;<code>Promise&nbsp;<\/code>resolvida, &nbsp;e espera por ele.<\/p><cite>Refer\u00eancia:  <a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Operators\/await\">https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Operators\/await<\/a> <\/cite><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo 1: Escrevendo uma fun\u00e7\u00e3o ass\u00edncrona com async\/await<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const fetch = require('node-fetch')\n\nfunction getPerson(id){\n\tconst response = await fetch(`http:\/\/swapi.co\/api\/people\/${id}`)\n\tconst person = await response.json()\n\tconsole.log(person.name)\n}\n\ngetPerson(1) \/\/Luke Skywalker<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Note que no exemplo acima existe duas express\u00f5es <strong>await<\/strong>, neste caso quando a primeira esta em execu\u00e7\u00e3o a fun\u00e7\u00e3o entra em pausa aguardando o retorno da promise, assim que recebe o retorno a fun\u00e7\u00e3o sai da pausa passando para a pr\u00f3xima linha de execu\u00e7\u00e3o, entrando novamente em pausa e assim poder finalizar todo o processo.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo 2:  Com Arrow Function<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const fetch = require('node-fetch')\n\nfunction getPerson(id){\n\tconst response = await fetch(`http:\/\/swapi.co\/api\/people\/${id}`)\n\treturn await response.json()\n}\n\ngetPerson(1)\n\t.then(person => console.log(person.name) \/\/Luke Skywalker<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li> Neste exemplo temos o mesmo processo do exemplo anterior, mais desta vez utilizando <em><strong><a href=\"https:\/\/developer.mozilla.org\/pt-BR\/docs\/Web\/JavaScript\/Reference\/Functions\/Arrow_functions\">Arrow functions<\/a><\/strong><\/em>,  tamb\u00e9m podemos notar a nota\u00e7\u00e3o do <strong>then<\/strong>, isto s\u00f3 \u00e9 poss\u00edvel porque o retorno \u00e9 uma <strong>Promise.<\/strong><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong> Exemplo 3: Utilizando Promise.all, Arrow function, Map <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const fetch = require('node-fetch')\nconst ids = [1, 2, 3, 4, 5]\nlet person = []\n\nfunction getPerson(id){\n\tconst response = await fetch(`http:\/\/swapi.co\/api\/people\/${id}`)\n\tconst person = await response.json()\t\n\treturn person.name\n}\n\nfunction getData(){\n\tperson.push(Promise.all(ids.map(item => getPerson(item)))\n\treturn person[0]\n}\n\nasync function result (){\n\tconsole.log(await getData())\n}\n\nresult()\n\t\/*[ 'Luke Skywalker',\n\t\t'C-3PO',\n\t\t'R2-D2',\n\t\t'Dart Vader',\n\t\t'LEia Organa' ] *\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para finalizar Deixo este c\u00f3digo para Reflex\u00e3o, Abra\u00e7o e at\u00e9 o Pr\u00f3ximo Post!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Entenda como trabalhar com Async\/Await Promises Antes de falar sobre async \/ await \u00e9 preciso entender Promises. Promises JavaScript.&nbsp;Promise, ou Promessa, \u00e9 um objeto usado para processamento ass\u00edncrono. Uma Promise&nbsp;representa um valor que pode estar dispon\u00edvel agora, no futuro ou nunca. Usando uma Promise, \u00e9 assegurado que a API n\u00e3o ser\u00e1 processada nem formatada at\u00e9 &hellip; <a href=\"https:\/\/blog.softmakers.com.br\/index.php\/2019\/10\/14\/como-trabalhar-com-async-await-e-entendendo-promises\/\" class=\"more-link\">Continuar lendo <span class=\"screen-reader-text\">Como trabalhar com Async \/ Await e entendendo Promises.<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":288,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[45,46,40,43,41,42],"class_list":["post-282","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-coding","tag-async","tag-await","tag-filter","tag-json","tag-map","tag-promise"],"_links":{"self":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts\/282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=282"}],"version-history":[{"count":5,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts\/282\/revisions"}],"predecessor-version":[{"id":451,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/posts\/282\/revisions\/451"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/media\/288"}],"wp:attachment":[{"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.softmakers.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}