【问题标题】: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函数中的值。

有关该主题的其他有用资源,请点击此处:

在原问题下方:


您能否帮助理解如何从承诺中获取价值以及这两个示例之间的差异?

//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) { … });

标签: javascript jquery variables promise parameter-passing


【解决方案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}`); });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2017-04-26
  • 2015-06-27
  • 2020-04-30
  • 2020-05-10
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多