作为对重复内容的评论进行编辑 以下是引用自:如何从异步调用中返回响应?
Promise是将来值的容器。当Promise接收到该值(它被解决)或被取消(拒绝)时,会通知所有希望访问此值的“侦听器”。
该问题是关于如何返回Promise中包含的值。这个答案对我很有用,因为它澄清了不能返回该值,而是要在Promise函数中访问该值。
关于此主题的其他有用来源,请参见以下内容:
- 如何从异步调用中返回响应?
- http://www.html5rocks.com/en/tutorials/es6/promises/
- jQuery deferreds和promises- .then() vs .done().
以下是原始问题:
请帮忙理解如何从Promise中获取值以及这两个示例之间的差异。
//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
}
最后,我想把它赋给结果。
下面的方法可以实现,但我认为这浪费了 promise 的概念,因为结果被赋值给了之前声明的全局变量:
var r;
fetch('val1','val2')
.then(function(data){
r = getResult(data);
})
相反,以下代码将 promise 函数分配给 res
。
var res = fetch('val1','val2')
.done(function(data){
return getResult(data);
})
请问如何将结果为'myobject'
传递到变量res
,而不是传递Promise本身?
我也尝试过:
var res = $.when(fetch('val1','val2'))
.done(function(data){
return getResult(data);
})
但是没有成功。
myobject
的res
。你所尝试的操作与使用全局r
变量所做的事情完全相同,并且它浪费了 Promise 的概念,在边缘情况下可能无法正常工作。你应该只需这样做fetch(…).then(getResult).then(function(res) { … });
。 - Bergi