如何将承诺的返回值分配给变量? [复制]
Posted
技术标签:
【中文标题】如何将承诺的返回值分配给变量? [复制]【英文标题】:how to assign the returned value of a promise to a variable? [duplicate] 【发布时间】: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) … );
【参考方案1】:
你必须使用全局变量trick,或者接受使用 save-as-a-promise 技巧。
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);
);
【讨论】:
谢谢!所以它在承诺本身内部使用变量的唯一方法。 谢谢!因此,只有在 Promise 本身内部才能访问 Promise 的值。更进一步:@Adam,我在浏览器控制台中运行getStuff .then(function(data1Data2) console.log(data1Data2); );
,它返回值和promise 本身。 (例如:`Object 'myobject' : result_from_data, Object `你能解释一下原因吗?
它不会同时返回值和承诺本身 - 该语句返回承诺(浏览器控制台记录)并且它也是 console.log
的数据,这就是您看到两个日志的原因.正如您所说,您的两个选择是 - 使用全局变量,或者只是存储承诺并始终通过 .then
访问它的数据
我这样做是这样的:1) 将您的代码放入一个返回承诺的函数中,promiseFunction()
2) 创建一个异步函数并将其放入:const varName = await promiseFunction().then((done) => return done; ).catch((err) => throw new Error(`RADICAL ERROR: $err`); );
以上是关于如何将承诺的返回值分配给变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何将从函数返回的布尔值分配给 PostgreSQL 9.4 中的变量?