как назначить возвращаемое значение обещания переменной?

EDITED как комментарий к дублированию, я цитирую: [ Как вернуть ответ от асинхронного вызова?

Обещания - это контейнеры для будущих значений. Когда обещание получает значение (оно разрешено) или когда оно отменено (отклонено), оно уведомляет всех своих "слушателей", которые хотят получить доступ к этому значению.

Этот вопрос касается того, как вернуть значение, содержащееся в обещании. Ответ был полезен мне, потому что он пояснил, что вернуть значение невозможно, а получить доступ к значению в функции обещания.

Другие полезные источники о предмете, здесь:

Ниже оригинального вопроса:


Не могли бы вы помочь в понимании того, как получить ценность от обещания и различий между этими двумя примерами?

//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
    }

И, наконец, я хочу присвоить ему результаты.

Следующие работы, но я думаю, что это расходует концепцию обещания, поскольку результат присваивается объявленной перед ним глобальной переменной:

var r;  
fetch('val1','val2')
.then(function(data){
  r = getResult(data);
})

Вместо этого следующее присваивает функцию обещания res.

var res = fetch('val1','val2')
.done(function(data){
  return getResult(data);
})

Не могли бы вы прояснить, как передать полученный 'myobject' переменной res, а не само обещание?

Я также пробовал:

var res = $.when(fetch('val1','val2'))
.done(function(data){
  return getResult(data);
})

но никакого успеха.

Ответ 1

Вы должны использовать трюк глобальной переменной или принять трюк save-as-a-prom.

var getStuff = $.when(req1,req2).then(function(data1,data2) { return data1.concat(data2); });

//the variable getStuff is now a promise and any .then chained 
//to it will have data1.concat(data2) passed to it as an argument

getStuff
  .then(function(data1Data2) {
    console.log(data1Data2);
  });

//the next time you want to use it, you have to use the same promise-interface with .then
getStuff
  .then(function(data1Data2) {
    console.log(data1Data2);
  });