Como acessar o valor de uma promise?

Eu estou olhando para este exemplo de documentos de Angular para $q mas acho que isso provavelmente se aplica a promises em geral. Eles têm este exemplo, copiado textualmente com seu 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() no resultado do primeiro .then() , encadeando-os, o que sei que posso, então promiseB é um object de promise, do tipo Object . Não é um Number . Então, o que eles querem dizer com “seu valor será o resultado de promiseA incrementado em 1”?

Eu deveria acessar isso como promiseB.value ou algo assim? Como o callback de sucesso pode retornar uma promise E retornar “resultado + 1”? Estou perdendo alguma coisa.

A function then promiseA retorna uma nova promise ( promiseB ) que é imediatamente resolvida depois que promiseA é resolvida, seu valor é o valor do que é retornado da function success dentro de promiseA .

Nesse caso, promiseA é resolvido com um valor – result e, em seguida, resolve imediatamente o promiseB com o valor de result + 1 .

Acessar o valor de promiseB é feito da mesma maneira que promiseA o resultado de promiseA .

 promiseB.then(function(result) { // here you can use the result of promiseB }); 

Quando uma promise é resolvida / rejeitada, ela será chamada de manipulador de sucesso / erro:

 var promiseB = promiseA.then(function(result) { // do something with result }); 

O método then também retorna uma promise: promiseB, que será resolvida / rejeitada dependendo do valor de retorno do manipulador de sucesso / erro de promiseA .

Existem três valores possíveis que os manipuladores de sucesso / erro do promiseA podem retornar que afetarão o resultado do promiseB:

 1. Return nothing --> PromiseB is resolved immediately, and undefined is passed to the success handler of promiseB 2. Return a value --> PromiseB is resolved immediately, and the value is passed to the success handler of promiseB 3. Return a promise --> When resolved, promiseB will be resolved. When rejected, promiseB will be rejected. The value passed to the promiseB's then handler will be the result of the promise 

Armado com esse entendimento, você pode entender o seguinte:

 promiseB = promiseA.then(function(result) { return result + 1; }); 

A chamada, em seguida, retorna promiseB imediatamente. Quando promiseA for resolvido, ele passará o resultado para prometer o manipulador de sucesso de A. Como o valor de retorno é o resultado de promiseA + 1, o manipulador de sucesso está retornando um valor (opção 2 acima), então o promiseB será resolvido imediatamente e o manipulador de sucesso do promiseB será passado ao resultado de promiseA + 1.

.then function de promiseB recebe o que é retornado da function then of promiseA.

aqui promiseA está retornando é um número, que estará disponível como parâmetro number em function de sucesso de promiseB. que será então incrementado em 1

Analisar o comentário de maneira um pouco diferente do seu entendimento atual pode ajudar:

 // promiseB will be resolved immediately after promiseA is resolved 

Isso indica que o promiseB é uma promise, mas será resolvido imediatamente após a promiseA ser resolvida. Outra maneira de ver isso significa que promiseA.then() retorna uma promise atribuída a promiseB .

 // and its value will be the result of promiseA incremented by 1 

Isso significa que o valor que promiseA resolveu é o valor que promiseB receberá como seu valor successCallback:

 promiseB.then(function (val) { // val is now promiseA's result + 1 }); 
 promiseA(pram).then( result => { //make sure promiseA function allready success and response //do something here }).catch(err => console.log(err)) => { // handle error with try catch } 

Você pode facilmente fazer isso usando um método de espera asynchronous em javascript.

Abaixo está um exemplo recuperando um valor de promise WebRTC usando um tempo limite.

 function await_getipv4(timeout = 1000) { var t1 = new Date(); while(!window.ipv4) { var stop = new Date() - t1 >= timeout; if(stop) { console.error('timeout exceeded for await_getipv4.'); return false; } } return window.ipv4; } function async_getipv4() { var ipv4 = null; var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}}) findIP.then(ip => window.ipv4 = ip); return await_getipv4(); }; 

Talvez esse pequeno exemplo de código de datilografia ajude.

 private getAccount(id: Id) : Account { let account = Account.empty(); this.repository.get(id) .then(res => account = res) .catch(e => Notices.results(e)); return account; } 

Aqui o repository.get(id) retorna um Promise . Eu o atribuo à account variável na declaração then .