как назначить возвращаемое значение обещания переменной?
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);
});