如何将承诺的返回值分配给变量? [复制]

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(异步事件)执行之前,没有返回值。预计将在以后。那么问题是 - 一旦分配了这个变量会发生什么?你能从事件和回调的角度来考虑你的设计吗? 你不能做你想做的事。异步是异步的 - 结果直到稍后一段时间才可用,在您的函数已经返回很久之后。您必须将使用结果的代码放在完成回调函数中,或者从该回调中调用某个函数并将数据作为参数传递。您引用的所有其他答案也告诉您。你显然只是不相信它。 告诉我们你将在哪里使用 resmyobject 东西。您正在尝试做的正是您对全局 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`); );

以上是关于如何将承诺的返回值分配给变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用for循环将返回值分配给变量

如何将从函数返回的布尔值分配给 PostgreSQL 9.4 中的变量?

VBA:无法将函数的返回值分配给变量[重复]

将`input`的值分配给变量但在JS中返回空白

如何将插入的输出值分配给 sql server 中的变量? [复制]

React - 如何将变量分配给另一个组件类中的输入值? [复制]