como atribuir o valor retornado de uma promessa a uma variável? [duplicado]
Esta pergunta já tem uma resposta aqui:
Como faço para retornar a resposta de uma chamada assíncrona? 33 respostasEDITADO como comentário para duplicar Cito de: [Como faço para retornar a resposta de uma chamada assíncrona?
Promessas são recipientes para valores futuros. Quando a promessa recebe o valor (é resolvido) ou quando é cancelada (rejeitada), notifica todos os seus "ouvintes" que desejam acessar esse valor.
Esta pergunta é sobre como retornar o valor contido na promessa. A resposta foi útil para mim, porque esclareceu que não é possívelRetorna o valor, em vez deacessar o valor dentro a função de promessa.
Outras fontes úteis sobre o assunto, aqui:
Como faço para retornar a resposta de uma chamada assíncrona?http://www.html5rocks.com/en/tutorials/es6/promises/jQuery adiado e promessas - .then () vs .done ().Abaixo da pergunta original:
Você poderia ajudar a entender como obter o valor de uma promessa e as diferenças entre esses dois exemplos?
//I have a simple ajax call like:
var fetch = function(start_node, end_node) {
var apiEndpoint = 'localhost/nodes/';
var loadurl = apiEndpoint+start_node+'/'+end_node;
return $.ajax({
url: loadurl,
type: 'GET',
dataType: 'json',
jsonpCallback: 'json'
});
};
// Then I processed results in something like:
var getResult = function(data) {
// do smtg with data
var result = {'myobject' : result_from_data}
return result
}
E, finalmente, quero atribuir resultados.
O seguinte funciona, mas acho que desperdiça o conceito da promessa, pois o resultado é atribuído a uma variável global declarada antes:
var r;
fetch('val1','val2')
.then(function(data){
r = getResult(data);
})
Em vez disso, o seguinte atribui a função de promessa ares
.
var res = fetch('val1','val2')
.done(function(data){
return getResult(data);
})
Você poderia esclarecer como passar o resultado'myobject'
para a variávelres
, e não a promessa em si?
Eu também tentei:
var res = $.when(fetch('val1','val2'))
.done(function(data){
return getResult(data);
})
mas sem sucesso.