Pelo que entendi, há três maneiras de chamar código assíncrono:
- Eventos, por exemplo
request.on("event", callback);
- Retornos de chamada, por exemplo
fs.open(path, flags, mode, callback);
- Promessas
Encontrei a biblioteca de promessas de nós, mas não a entendo.
Alguém poderia explicar quais são as promessas e por que devo usá-las?
Além disso, por que ele foi removido do Node.js.
javascript
node.js
promise
ajsie
fonte
fonte
Respostas:
As promessas no node.js prometeram fazer algum trabalho e, em seguida, tiveram retornos de chamada separados que seriam executados para obter êxito e falha, além de lidar com tempos limite. Outra maneira de pensar nas promessas no node.js era que eles eram emissores que podiam emitir apenas dois eventos: sucesso e erro.
O interessante das promessas é que você pode combiná-las em cadeias de dependência (faça a Promessa C somente quando a Promessa A e a Promessa B estiverem concluídas).
Ao removê-los do core node.js, criou a possibilidade de construir módulos com diferentes implementações de promessas que podem ficar no topo do core. Alguns deles são promessa de nó e futuros .
fonte
Como essa pergunta ainda tem muitos pontos de vista (como o meu), eu gostaria de salientar que:
fonte
Uma promessa é uma "coisa" que representa os resultados "eventuais" de uma operação, por assim dizer. O ponto a ser observado aqui é que ele abstrai os detalhes de quando algo acontece e permite que você se concentre no que deve acontecer depois que algo acontecer. Isso resultará em um código limpo e sustentável, onde, em vez de ter um retorno de chamada dentro de um retorno de chamada, seu código será parecido com:
As especificações das promessas afirmam que uma promessa é
O método deve retornar uma nova promessa que é cumprida quando o retorno de chamada successHandler ou failHandler especificado é concluído. Isso significa que você pode encadear promessas quando tiver um conjunto de tarefas assíncronas que precisam ser executadas e ter certeza de que o seqüenciamento de operações é garantido como se você tivesse usado retornos de chamada. Portanto, em vez de passar um retorno de chamada para dentro de um retorno de chamada, o código com promessas encadeadas se parece com:
Para saber mais sobre as promessas e por que elas são super legais, confira o blog de Domenic: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/
fonte
Este novo tutorial sobre promessas do autor do PouchDB é provavelmente o melhor que eu já vi em qualquer lugar. Ele cobre sabiamente os erros clássicos de novatos, mostrando os padrões de uso corretos e até alguns anti-padrões que ainda são comumente usados - mesmo em outros tutoriais !!
Aproveitar!
PS: Eu não respondi algumas outras partes desta pergunta, pois elas foram bem cobertas por outras.
fonte
Mike Taulty tem uma série de vídeos , cada um com menos de dez minutos, descrevendo como a biblioteca WinJS Promise funciona.
Esses vídeos são bastante informativos e Mike consegue mostrar o poder da API Promise com alguns exemplos de código bem escolhidos.
O tratamento de como as exceções são tratadas é particularmente bom.
Apesar das referências do WinJs, esta é uma série de vídeos de interesse geral, porque a API do Promise é amplamente semelhante em muitas implementações.
Responda Por Favor é uma implementação leve do Promise que passa no conjunto de testes Promise / A +. Eu gosto bastante da API, porque é semelhante em estilo à interface do WinJS.
Atualização abr-2014
Aliás, a biblioteca WinJS agora é de código aberto .
fonte
deferreds
eresolve
edeferred.promise.then
e predefinir depromiseActions
na popular documentação da biblioteca Q. Alguma chance de você saber algo tão simples sobre o Node.js ?Outra vantagem das promessas é que o tratamento de erros e a ativação e captura de exceções são muito melhores do que tentar lidar com isso com retornos de chamada.
A biblioteca bluebird implementa promessas e fornece ótimos rastreamentos de pilha longa, é muito rápida e alerta sobre erros não detectados. Também é mais rápido e usa menos memória do que as outras bibliotecas promissoras, de acordo com http://bluebirdjs.com/docs/benchmarks.html
fonte
O que exatamente é uma promessa?
Uma promessa é simplesmente um objeto que representa o resultado de uma operação assíncrona. Uma promessa pode estar em qualquer um dos três estados a seguir:
pendente :: Este é o estado inicial, significa que a promessa não é cumprida nem rejeitada.
cumprida : significa que a promessa foi cumprida, significa que o valor representado pela promessa está pronto para ser usado.
rejeitado :: Isso significa que as operações falharam e, portanto, não podem cumprir a promessa. Além dos estados, existem três entidades importantes associadas a promessas que realmente precisamos entender
executor function :: executor function define a operação assíncrona que precisa ser executada e cujo resultado é representado pela promessa. Inicia a execução assim que o objeto de promessa é inicializado.
resolve :: resolve é um parâmetro passado para a função executora e, caso o executor seja executado com êxito, essa resolução será chamada passando o resultado.
Reject :: Reject é outro parâmetro passado para a função executora e é usado quando a função executora falha. O motivo da falha pode ser passado para a rejeição.
Portanto, sempre que criamos um objeto de promessa, devemos fornecer Executor, Resolve e Reject.
Referência :: Promessas
fonte
Também estive procurando promessas no node.js recentemente. Até o momento, o when.js parece ser o caminho a seguir devido à sua velocidade e uso de recursos, mas a documentação do q.js me deu um entendimento muito melhor. Portanto, use when.js, mas o q.js documenta para entender o assunto.
A partir dos q.js leia-me no github:
fonte
O objeto Promise representa a conclusão ou falha de uma operação assíncrona.
Portanto, para implementar uma promessa, você precisa de duas partes:
1. Criando Promessa:
2. Promessa de Manuseio:
fonte