【问题标题】:return value after a promise [duplicate]承诺后的返回值[重复]
【发布时间】:2014-05-21 23:39:29
【问题描述】:

我有一个 javascript 函数,我想返回在 return 方法之后得到的值。 比解释更容易看到

function getValue(file){
    var val;
    lookupValue(file).then(function(res){
       val = res.val;
    }
    return val;
}

用承诺来做到这一点的最佳方式是什么。据我了解,return val 将在 lookupValue 完成之前返回,但我不能return res.val 因为那只是从内部函数返回。

【问题讨论】:

  • @OneKitten,您链接到的问题不是使用承诺,而是将函数作为回调传递,我认为这完全不同。
  • 同一个概念,promise 仍然是异步的。
  • 我也需要一个答案。所以基本上不可能编写一个带有承诺的函数,它返回console.log(getValue('myFile.txt'));函数调用的结果?如果这是真的,那就糟透了,因为有时甚至这个调用也是不必要的样板:getValue('myFile.txt').then((val) => { console.log(val) });

标签: javascript node.js promise q


【解决方案1】:

最好的方法是使用 promise 返回函数,就像这样

lookupValue(file).then(function(res) {
    // Write the code which depends on the `res.val`, here
});

调用异步函数的函数不能等到异步函数返回值。因为,它只是调用 async 函数并执行其中的其余代码。因此,当异步函数返回一个值时,调用它的同一个函数不会接收到它。

因此,一般的想法是在异步函数本身中编写依赖于异步函数返回值的代码。

【讨论】:

  • 你没有错,但是你的解决方案违反了封装原则。调用 getValue(...) 的对象或函数不应该也不应该知道函数 lookupValue(...)。这样,如果 getValue(...) 中的确切过程发生变化,则不需要更新依赖它的函数。
【解决方案2】:

使用遵循以下原则的模式:

function getValue(file) {
  return lookupValue(file);
}

getValue('myFile.txt').then(function(res) {
  // do whatever with res here
});

(虽然这有点多余,但我相信你的实际代码更复杂)

【讨论】:

  • 你能举个lookupValue的例子吗?
猜你喜欢
  • 2015-02-13
  • 2020-08-26
  • 2021-06-29
  • 2015-11-04
  • 2016-10-20
  • 2018-06-03
  • 2019-04-21
  • 1970-01-01
相关资源
最近更新 更多