Estou vendo este exemplo nos documentos da Angular, $q
mas acho que isso provavelmente se aplica às promessas em geral. O exemplo abaixo é copiado literalmente de seus documentos com o comentário incluído:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
Não estou claro como isso funciona. Se eu puder chamar .then()
o resultado do primeiro .then()
, encadeando-os, o que eu sei que posso, então promiseB
é um objeto de promessa, do tipo Object
. Não é um Number
. Então, o que eles querem dizer com "seu valor será o resultado da promessaA incrementada em 1"?
Devo acessar isso como promiseB.value
ou algo assim? Como o retorno de chamada de sucesso retorna uma promessa E retorna "resultado + 1"? Estou sentindo falta de algo.
javascript
angularjs
promise
angular-promise
temporary_user_name
fonte
fonte
Respostas:
promiseA
Athen
função de retorna uma nova promessa (promiseB
) que é resolvida imediatamente após apromiseA
resolução, seu valor é o valor daquilo que é retornado da função de sucessopromiseA
.Nesse caso,
promiseA
é resolvido com um valor -result
e, em seguida, resolve imediatamentepromiseB
com o valor deresult + 1
.O acesso ao valor de
promiseB
é feito da mesma maneira que acessamos o resultado depromiseA
.Editar dezembro de 2019 :
async
/await
agora é padrão em JS, o que permite uma sintaxe alternativa à abordagem descrita acima. Agora você pode escrever:Agora não há promessaB, porque desembrulhamos o resultado do uso da promessaA
await
e você pode trabalhar diretamente com ele.No entanto,
await
só pode ser usado dentro de umaasync
função. Portanto, para diminuir um pouco o zoom acima, o conteúdo acima deveria estar contido da seguinte forma:fonte
Quando uma promessa é resolvida / rejeitada, ela chama seu manipulador de sucesso / erro:
O
then
método também retorna uma promessa: promessaB, que será resolvida / rejeitada dependendo do valor de retorno do manipulador de sucesso / erro da promessaA .Existem três valores possíveis que os manipuladores de sucesso / erro da promessaA podem retornar que afetarão o resultado da promessaB:
Armado com esse entendimento, você pode entender o seguinte:
A chamada então retorna a promessaB imediatamente. Quando a promessaA for resolvida, ele passará o resultado para o manipulador de sucesso da promessaA. Como o valor de retorno é o resultado da promessaA + 1, o manipulador de sucesso está retornando um valor (opção 2 acima), então a promessaB será resolvida imediatamente e o manipulador de sucesso da promessaB será aprovado no resultado da promessaA + 1.
fonte
.then
função da promessaB recebe o que é retornado da.then
função da promessaA.aqui a promessaA está retornando é um número, que estará disponível como
number
parâmetro na função de sucesso da promessaB. que será incrementado em 1fonte
Analisar o comentário de maneira um pouco diferente da sua compreensão atual pode ajudar:
Isso afirma que
promiseB
é uma promessa, mas será resolvido imediatamente após apromiseA
resolução. Outra maneira de ver isso significa quepromiseA.then()
retorna uma promessa à qual está atribuídopromiseB
.Isso significa que o valor que
promiseA
resolveu é o valor quepromiseB
receberá como seu valor successCallback:fonte
A resposta de pixelbits está correta e você deve sempre usar
.then()
para acessar o valor de uma promessa no código de produção.No entanto, existe uma maneira de acessar o valor da promessa diretamente após a resolução, usando a seguinte ligação node.js interna não suportada:
AVISO: process.binding nunca foi concebido para ser usado fora do nó nodejs e a equipe principal do nodejs está procurando ativamente substituí-lo
https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064
fonte
Este exemplo eu acho auto-explicativo. Observe como o aguardador aguarda o resultado e você perde a promessa de ser devolvida.
fonte
fonte
Você pode fazer isso facilmente usando um método de espera assíncrona em javascript.
Abaixo está um exemplo de recuperação de um valor da promessa do WebRTC usando um tempo limite.
fonte
No nó REPL, para obter uma conexão de banco de dados com o valor de uma promessa, adotei a seguinte abordagem:
A linha com
await
normalmente retornaria uma promessa. Esse código pode ser colado no nó REPL ou, se salvoindex.js
, pode ser executado no Bash comque deixa você no Node REPL após executar o script com acesso à variável definida. Para confirmar que a função assíncrona retornou, você pode registrar,
connection
por exemplo, e está pronto para usar a variável. É claro que não seria necessário contar com a função assíncrona sendo resolvida ainda para qualquer código no script fora da função assíncrona.fonte
Há uma boa resposta acima e aqui está a versão da função ES6 Arrow
fonte
Sou um aprendiz lento de promessas de javascript, por padrão, todas as funções assíncronas retornam uma promessa, você pode agrupar seu resultado como:
" A expressão de espera faz com que a execução da função assíncrona seja pausada até que uma Promessa seja liquidada (ou seja, cumprida ou rejeitada) e retome a execução da função assíncrona após o cumprimento. Quando retomado, o valor da expressão aguardada é o da Promessa cumprida Se a promessa for rejeitada, a expressão de espera lança o valor rejeitado . "
Leia mais sobre aguardar e prometer no MDN Web Docs
fonte
Talvez este pequeno exemplo de código TypeScript ajude.
Aqui os
repository.get(id)
retornos aPromise<Account>
. Eu atribuí-lo à variávelaccount
dentro dathen
declaração.fonte