【问题标题】:How return a value from an async/await function [duplicate]如何从异步/等待函数返回值[重复]
【发布时间】:2019-06-13 12:19:29
【问题描述】:

我正在尝试编写一个可重用的函数,该函数在解决来自 mongodb 查询的承诺之前不会返回。 我几乎可以使用 IIFE 函数实现这一点,但在我从函数返回之前似乎无法访问解析的值。在下面的 sn-p 中,我可以将变量 d 打印到控制台,但我无法使其在 iffe 之外可访问,因此无法返回结果。

在下面的示例中,第一个 console.log 返回正确的结果,但第二个返回待处理的 promise。 任何有关如何使这项工作或替代方法的建议将不胜感激。

function getDNInfo (party){
  var result;
  result= (async () => { result = await mongo.findOne({DN:party.user_Number}, "BWUsers")
    .then(
            (d)=>{
              console.log(d)
              result=d;
            }"
        )}
   )();
   console.log(result)
   return result;

  }

【问题讨论】:

  • 您不能同步处理将来检索到的值(异步)
  • result 在回调有机会更新值之前返回。您是否希望 getDNInfo 同步?
  • 我已经阅读了上面提到的副本——他们没有明确回答我的问题。我能找到的每个示例都显示了在 Promise 中可访问的值,但从未在 Promise 之外显示可访问的形式。它认为解决方案是使完整的调用堆栈异步函数,我试图避免,但似乎没有办法绕过它。

标签: node.js mongodb async-await


【解决方案1】:

您应该能够将查询结果存储在一个变量中并像这样返回该变量:

async function getDNInfo(party) {
    var result = await mongo.findOne({DN:party.user_Number}, "BWUsers");
    return result;
}

【讨论】:

  • 谢谢,但是让 getDNInfo 异步只会将问题推到调用堆栈上。该函数返回一个未决的承诺。我需要它来返回解析的值。
【解决方案2】:

由于异步函数返回一个承诺,因此使用方法 1 我们可以跳过编写等待,因为它会自动等待查询得到解决而无需编写等待或者您始终可以使用方法 2 进行传统的实现方式。

方法一:

 const getDNInfo = async (party) => {
        return mongo.findOne({DN:party.user_Number}, "BWUsers");
    }

方法二:

    const getDNInfo = async (party) => {
                const result = await mongo.findOne({DN:party.user_Number}, "BWUsers");
                return result;
    }

【讨论】:

  • 在这两种情况下,异步函数都会返回一个 Promise,因此 getDNInfo 将是一个待处理的 Promise,而不是解析后的值。
  • 我不确定你想如何使用结果,但如果你在方法 2 中使用 console.log(result) 你会得到结果。
猜你喜欢
  • 2018-01-03
  • 2020-08-19
  • 2020-12-23
  • 1970-01-01
  • 2020-03-13
  • 2011-03-04
  • 2021-05-25
  • 2019-02-06
  • 1970-01-01
相关资源
最近更新 更多