承诺后的返回值[重复]

Posted

技术标签:

【中文标题】承诺后的返回值[重复]【英文标题】: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 仍然是异步的。 ***.com/q/22536385/1348195 我也需要一个答案。所以基本上不可能编写一个带有承诺的函数,它返回console.log(getValue('myFile.txt'));函数调用的结果?如果这是真的,那就糟透了,因为有时甚至这个调用也是不必要的样板:getValue('myFile.txt').then((val) => console.log(val) ); 实际答案: softwareengineering.stackexchange.com/a/350041/171994 【参考方案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的例子吗?

以上是关于承诺后的返回值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 .map 分配返回的承诺的值 [重复]

承诺链中的返回值没有被调用

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

异步函数返回承诺,而不是值

异步函数返回承诺,而不是值

节点承诺和返回值