Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何从异步/等待函数返回值_Node.js_Mongodb_Async Await - Fatal编程技术网

Node.js 如何从异步/等待函数返回值

Node.js 如何从异步/等待函数返回值,node.js,mongodb,async-await,Node.js,Mongodb,Async Await,我正在尝试编写一个可重用函数,它在解析mongodb查询的承诺之前不会返回。 我几乎可以使用IIFE函数实现这一点,但在我从函数返回之前,似乎无法访问已解析的值。在下面的代码段中,我可以将变量d打印到控制台,但我无法在iffe外部访问它,因此无法返回结果 在下面的示例中,第一个console.log返回正确的结果,但第二个返回挂起的承诺。 任何关于如何使这项工作或替代方法的建议将不胜感激 function getDNInfo (party){ var result; result= (a

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

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

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;

  }

您应该能够将查询结果存储在一个变量中,并按如下方式返回该变量:

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

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

方法1:

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

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

您不能同步处理将来异步检索的值。结果在回调有机会更新该值之前返回。您希望getDNInfo是同步的吗?我已经阅读了上面提到的副本-它们没有明确回答我的问题。我能找到的每一个例子都显示了在承诺内可以访问的值,但它从来没有显示出在承诺外可以访问的形式。它认为解决方案是使完整的调用堆栈异步函数,这是我试图避免的,但似乎没有办法解决。谢谢,但使getDNInfo异步只会将问题推到调用堆栈上。函数返回一个挂起的承诺。我需要它来返回解析的值。在这两种情况下,异步函数都会返回一个承诺,因此getDNInfo将是一个挂起的承诺,而不是解析的值。我不确定您希望如何使用结果,但如果您在方法2中使用console.logresult,您将得到结果。