如何将Promise的返回值分配给一个变量?

20

作为对重复内容的评论进行编辑 以下是引用自:如何从异步调用中返回响应?

Promise是将来值的容器。当Promise接收到该值(它被解决)或被取消(拒绝)时,会通知所有希望访问此值的“侦听器”。

该问题是关于如何返回Promise中包含的值。这个答案对我很有用,因为它澄清了不能返回该值,而是要在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
    }

最后,我想把它赋给结果。

下面的方法可以实现,但我认为这浪费了 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);
})

但是没有成功。


1
我认为这是一个误解。在承诺(异步事件)执行之前,没有值可返回。这预计会在稍后发生。那么问题是 - 一旦分配了这个变量,它会发生什么?您能否考虑在事件和回调方面设计您的代码? - Danny Staple
3
你无法做你想要做的事情。异步是异步的,结果直到一段时间后才变为可用,而你的函数早已返回。你必须将使用结果的代码放在完成回调函数内部或从该回调函数中调用某个函数并将数据作为参数传递。所有其他答案也告诉你这一点。你显然不相信它。 - jfriend00
1
展示一下你将在哪里使用 myobjectres。你所尝试的操作与使用全局 r 变量所做的事情完全相同,并且它浪费了 Promise 的概念,在边缘情况下可能无法正常工作。你应该只需这样做 fetch(…).then(getResult).then(function(res) { … }); - Bergi
1个回答

11

你必须使用全局变量trick,或者接受使用保存为承诺的技巧。

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);
  });

1
谢谢!所以唯一的方法是在 Promise 内部使用变量。 - user305883
谢谢!因此,只有在 Promise 内部才能访问 Promise 的值。稍微深入一点:@Adam,我在浏览器控制台中运行了 getStuff .then(function(data1Data2) { console.log(data1Data2); });,它返回了值和 _Promise 本身_。(例如:Object {'myobject' : result_from_data}, Object {})你能解释一下为什么吗? - user305883
2
它不会返回值和 Promise 本身 - 该语句只返回 Promise(这是浏览器控制台记录的),并且还 console.log 数据,这就是为什么你看到两个日志。正如你所说,你有两个选项 - 使用全局变量,或者简单地存储 Promise 并始终通过 .then 访问其数据。 - Adam Jenkins
我使用以下方式:1)将您的代码放到返回 Promise 的函数内,promiseFunction();2)创建一个异步函数,并将其放入以下内容: const varName = await promiseFunction().then((done) => { return done; }).catch((err) => { throw new Error(根本性错误:${err}); }); - agm1984

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接