Qual é a terminologia correta para promises de javascript

Eu estou ficando confuso com a terminologia diferente jogada ao redor. Pelo que entendi, uma promise pode ser:

fulfilled rejected pending settled resolved defer 

A resolução significa resolvida? ou significa que é cumprido? e o que diabos é adiar?

   

A terminologia pode ser difícil.
Vamos tirar da especificação Promises / A + e da respectiva seção ES6 que existem 3 estados :

  • pendente – a promise ainda não tomou um valor, seu futuro ainda é incerto.
  • cumprida – a promise obteve com sucesso um valor de resultado “atribuído”
  • rejeitado – a promise é dada uma razão pela qual nenhum resultado pode ser adquirido, tipicamente um erro.

O termo resolvido é um hiperônimo para preenchido e rejeitado, ou seja, o oposto de pendente.

Os verbos dynamics cumprem e rejeitam descrevem a mudança do estado de pendente para o preenchido ou rejeitado. Essas transições são chamadas de cumprimento ou rejeição da promise.

Aqueles eram fáceis. Agora, a resolução é uma fera diferente. Às vezes é usado sinônimo de “cumprir”, mas seria melhor entender como resolver o destino da promise para ser cumprida ou rejeitada. A resolução (raramente: liquidação) de uma promise significa que ela deixa o estado pendente. Mas nem isso é exato – o problema é a natureza recursiva do Procedimento de Resolução de Promessas :

  • Resolver uma promise com um valor “simples” significa cumpri-la.
  • Resolver uma promise com uma promise (ou então) significa adotar seu estado:

    • resolver com uma promise cumprida é um cumprimento
    • resolver com uma promise rejeitada é uma rejeição
    • resolver com uma promise pendente significa esperar pela sua resolução

Sim, se uma promise for resolvida, talvez nem se saiba se ela será cumprida ou rejeitada. Mas isso significa que o destino não é mais indeterminado , pois está ligado à promise com a qual resolvemos (observe que você pode resolver uma promise apenas uma vez).

Ignorando este caso especial, uma promise resolvida geralmente significa uma promise resolvida.

Ou, para citar a especificação do ECMAScript 6 :

Uma promise é resolvida se for resolvida ou se estiver “bloqueada” para corresponder ao estado de outra promise. A tentativa de resolver ou rejeitar uma promise resolvida não tem efeito. Uma promise não é resolvida se não for resolvida. Uma promise não resolvida está sempre no estado pendente. Uma promise resolvida pode estar pendente, cumprida ou rejeitada.


e o que diabos é adiar?

Adiar um resultado significa que você retorna uma promise (assíncrona) para o resultado e não o resultado diretamente (em sincronia). E também retorne uma rejeição adiada em vez de jogar de forma síncrona .

Observe que ” defer ” também é usado em algumas bibliotecas ( Q ) como o nome do método para construir um object Deferred – veja esta resposta em As diferenças entre Deferred, Promise e Future para uma boa explicação.
Ah, e nunca confie em nomes de variables: defer pode ser um “deferredObject” abreviado.

Os três estados prometidos estão listados na seção 2.1 da especificação Promises / A + .

A partir da especificação:

insira a descrição da imagem aqui

Então, aqui estão todos os termos que você perguntou sobre:

Pendente é o estado inicial da promise. A operação representada pela promise ainda não foi preenchida ou rejeitada.

Cumprido é outro dos três estados prometidos. Isso significa que a promise foi resolvida e agora tem seu valor resolvido. A operação representada pela promise foi concluída com sucesso.

Rejeitado é outro dos três estados prometidos. Isso significa que a promise foi rejeitada e agora tem seu motivo rejeitado. A operação representada pela promise falhou em obter um valor e, portanto, tem uma razão para não fazer isso (normalmente um código de erro ou um object de erro, mas pode ser qualquer coisa).

Estabelecido é um termo que significa que a promise é cumprida ou rejeitada (por exemplo, não está mais pendente), mas não é um estado separado, apenas um termo descritivo para indicar que não está mais pendente.

Resolvido é um termo que muitas vezes é usado para significar o mesmo que fulfilled , mas os dois não são exatamente os mesmos. Uma promise pode ser resolvida com um valor que leva ao cumprimento ou pode ser resolvido com uma promise rejeitada (que leva à rejeição desta promise) ou pode ser resolvida com uma promise pendente (o que significa que agora estará aguardando a eventual estado de alguma outra promise).

É difícil dizer exatamente o que você quer dizer com adiar . As promises são frequentemente classificadas como objects deferred pois são um object que representa uma ação e resultado que é diferido para o futuro (ocorrerá no futuro). Em algumas implementações de promises, existem na verdade dois tipos de objects, um object deferred e um object de promise . O object diferido é um superconjunto do object promise. Ambos podem observar quando a ação é resolvida ou rejeitada com os manipuladores .then() . Mas somente o object deferred pode realmente alterar o estado para resolved ou rejected .

No jQuery, você pode criar um object diferido com $.Deferred() . Em outras implementações como o ES6 promete, você só tem objects promissores com um callback de construtor que reject e resolve funções. O mundo está, presumivelmente, se movendo em direção ao que o ES6 terá.

Exemplo de jQuery que usa um object deferred :

 function delay(t) { var defer = $.Deferred(); setTimeout(function() { defer.resolve(); }, t); return defer.promise() } delay(200).then(function() { // run my delayed function now doMyThing(); }); 

Exemplo de promise ES6:

  function delay(t) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(); }, t); }); } delay(200).then(function() { // run my delayed function now doMyThing(); }); 

Os ” States and Fates ” de Domenic Denicola é um bom e conciso resumo.

Estados:

  • uma promise é cumprida se a promise.then(f) chamará f “o mais breve possível”
  • uma promise é rejeitada se prometer promise.then(undefined, r) chamará r “o mais rápido possível”
  • uma promise está pendente se não for cumprida nem rejeitada.

Destinos:

  • uma promise é resolvida se tentar resolvê-la ou rejeitá-la não tiver efeito, ou seja, a promise foi “bloqueada” para seguir outra promise ou foi cumprida ou rejeitada
  • uma promise não é resolvida se não for resolvida, ou seja, se tentar resolver ou rejeitá-la terá um impacto na promise.

Siga o link para obter detalhes sobre estados e destinos relacionados ‘.