【发布时间】:2015-12-13 07:01:21
【问题描述】:
已编辑为要复制的评论 我引用自:[How do I return the response from an asynchronous call?
Promise 是未来值的容器。当承诺收到 值(已解决)或当它被取消(拒绝)时,它 通知所有想要访问此值的“侦听器”。
这个问题是关于如何返回承诺中包含的值。 答案对我很有用,因为它阐明了不可能返回值,而是访问 promise函数中的值。
有关该主题的其他有用资源,请点击此处:
- How do I return the response from an asynchronous call?
- http://www.html5rocks.com/en/tutorials/es6/promises/
- jQuery deferreds and promises - .then() vs .done()。
在原问题下方:
您能否帮助理解如何从承诺中获取价值以及这两个示例之间的差异?
//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);
})
下面将 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);
})
但没有成功。
【问题讨论】:
-
我认为这是一种误解。在 promise(异步事件)执行之前,没有返回值。预计将在以后。那么问题是 - 一旦分配了这个变量会发生什么?你能从事件和回调的角度来考虑你的设计吗?
-
你不能做你想做的事。异步是异步的 - 结果直到稍后一段时间才可用,在您的函数已经返回很久之后。您必须将使用结果的代码放在完成回调函数中,或者从该回调中调用某个函数并将数据作为参数传递。您引用的所有其他答案也告诉您。你显然只是不相信它。
-
告诉我们你将在哪里使用
res和myobject东西。您正在尝试做的正是您对全局r变量所做的事情 - 事实上,它浪费了承诺的概念,并且可能在极端情况下不起作用。你应该只是在做fetch(…).then(getResult).then(function(res) { … });
标签: javascript jquery variables promise parameter-passing