Introdução às promessas
uma promessa é comumente definida como um proxy para um valor que eventualmente se tornará disponível.
promessas são uma maneira de lidar com o código assíncrono, sem ficar preso no inferno de callback.
As promessas têm sido parte da linguagem por anos (padronizado e introduzido no ES2015), e recentemente se tornaram mais integrados, com async e aguardar em ES2017.,funções
async usam promessas nos bastidores, então entender como as promessas funcionam é fundamental para entender como async
eawait
trabalho.
como as promessas funcionam, em breve
Uma vez que uma promessa foi chamada, ela começará em um estado pendente. Isto significa que a função de chamada continua executando, enquanto a promessa está pendente até que se resolva, dando à função de chamada quaisquer dados que estavam sendo solicitados.,
criado promessa, vai eventualmente acabar em um estado resolvido, ou em um rejeitada estado, chamando as respectivas funções de retorno de chamada (passado para then
e catch
) ao terminar.que APIs JS usam promessas?
além do seu próprio código e código de bibliotecas, as promessas são usadas por APIs web modernas padrão, tais como:
- a API de bateria
- a API de busca
trabalhadores de Serviços
é improvável que em JavaScript moderno você vai encontrar-se não usando promessas, por isso vamos começar a mergulhar neles.,
a Criação de uma promessa
A Promessa de API expõe uma Promessa do construtor, o que você inicializar usando new Promise()
:
Como você pode ver, a promessa verifica o done
global constante, e se isso é verdade, a promessa vai para um estado resolvido (já que o resolve
retorno de chamada foi chamado); caso contrário, o reject
callback é executado, colocando a promessa em um rejeitada estado., (Se nenhuma dessas funções é chamado no caminho de execução, a promessa de permanecer em um estado pendente)
Usando a tag resolve
e reject
, podemos comunicar-se de volta para o chamador que a resultante promessa de estado foi, e o que fazer com ele. No caso acima, apenas retornamos uma string, mas pode ser um objeto, ou null
também. Porque nós criamos a promessa no trecho acima, ela já começou a executar. Isto é importante para entender o que está acontecendo na seção consumindo uma promessa abaixo.,
um exemplo mais comum que você pode encontrar é uma técnica chamada Promisificação. Esta técnica é uma maneira de ser capaz de usar uma função JavaScript clássica que toma uma resposta, e fazê-la retornar uma promessa:
em versões recentes do nó.js, você não terá que fazer esta conversão manual para uma grande parte da API. Existe uma função promocional disponível no módulo util que fará isso por você, dado que a função que você está promisificando tem a assinatura correta.,
consumindo uma promessa
na última seção, introduzimos como uma promessa é criada.agora vamos ver como a promessa pode ser consumida ou usada.
Com checkIfItsDone()
irá especificar funções para executar quando o isItDoneYet
promessa resolve (then
chamada) ou rejeita (catch
chamada).uma promessa pode ser devolvida a outra promessa, criando uma cadeia de promessas.,
um grande exemplo de promessas de encadeamento é a API de obtenção, que podemos usar para obter um recurso e colocar em fila uma cadeia de promessas para executar quando o recurso é obtido.
a API Fetch é um mecanismo baseado em promessas, e chamar fetch()
é equivalente a definir a nossa própria promessa usandonew Promise()
.
Exemplo de encadeamento de promessas
neste exemplo, nós chamamos de fetch()
para obter uma lista de itens para FAZER a partir de todos.json
arquivo encontrado na raiz do domínio, e nós criamos uma cadeia de promessas.,
Com fetch()
retorna uma resposta, que tem muitas propriedades, e, dentro desses nós de referência:
-
status
, um valor numérico que representa o código de status HTTP -
statusText
, uma mensagem de status, o que éOK
se o pedido conseguiu
response
também possui json()
método, que retorna uma promessa de que vai resolver com o conteúdo do corpo processadas e transformadas em JSON.,a primeira promessa na cadeia é uma função que definimos, chamada status()
, que verifica o estado de resposta e se não é uma resposta de sucesso (entre 200 e 299), rejeita a promessa.
Esta operação fará com que a cadeia de promessas salte todas as promessas acorrentadas listadas e irá saltar directamente para o texto
no fundo, registrando oRequest failed
o texto juntamente com a mensagem de erro.,
If that succeeds instead, it calles the json()
function we defined. Desde que a promessa anterior, quando bem sucedida, devolveu o objeto response
, obtemo-lo como uma entrada para a segunda promessa.
neste caso, devolvemos os dados que o JSON processou, de modo que a terceira promessa recebe o JSON diretamente:
.then((data) => { console.log('Request succeeded with JSON response', data)})
e simplesmente o registramos no console.no exemplo, na seção anterior, tínhamos um id
que foi adicionado à cadeia de promessas.,
Quando qualquer coisa na cadeia de promessas falha e levanta um erro ou rejeita a promessa, o Controle vai para o mais próximo afirmação abaixo da cadeia.
erros de cascata
se dentro do catch()
se criar um erro, poderá adicionar um segundocatch()
para lidar com ele, e assim por diante.
promessas orquestradas
promessa.,all ()
Se precisar de sincronizar as diferentes promessas, Promise.all()
ajuda-o a definir uma lista de promessas e a executar algo quando todas elas estiverem resolvidas.
Exemplo:
O ES2015 desestruturação de atribuição de sintaxe permite que você para também fazer
Promise.all().then(() => { console.log('Results', res1, res2)})
Você não está limitado a usar fetch
claro, nenhuma promessa pode ser usado desta forma.prometo.,race ()
Promise.race()
corre quando a primeira das promessas que você passa para ele resolve, e ele executa o callback anexado apenas uma vez, com o resultado da primeira promessa resolvida.,
Exemplo:
erros Comuns
não identificada TypeError: indefinido não é uma promessa
Se você obter o Uncaught TypeError: undefined is not a promise
erro no console, certifique-se de que você use new Promise()
em vez de apenas Promise()
UnhandledPromiseRejectionWarning
Isto significa que uma promessa chamado rejeitado, mas não há uma catch
usado para tratar o erro. Adicione a catch
após a ofensathen
para lidar com isso corretamente.