如何从node.js中的异步函数返回值

时间:2017-02-22 19:18:24

标签: node.js asynchronous

我最近开始学习MEAN。我有以下代码来返回MongoDb文档的集合。

var giveData = function()
{
var mongodb = require('mongodb');
var mongoClient = mongodb.MongoClient;

var url = 'mongodb://127.0.0.1:27017/ngs'  



var retVal;  // this is a return value which will contain documents


mongoClient.connect(url, function(err, db)
                        {
                            if (err)
                            {
                                console.log(err)
                            }else
                            {
                                 db.collection('employees').find().toArray(
                                    function(err, doc)
                                    {
                                        if(err)
                                        { 
                                            throw err;
                                        }else{
                                            console.log(doc); // this works fine 
                                            retVal = doc;     // this does not assign the value ????  why so ??

                                        }

                                    }

                                );

                            }
                        }
                    )

console.log("Message from lib");                    
console.log(retVal);  // this returns undefined 
console.log("-----------------");

return retVal;  // this may return data from the server but is returning undefined 


}

 module.exports ={  showMessage: showMessage,
                        giveData: giveData
                    }

从评论中我很清楚,我希望将MongoDb数据库中的文档集合到一个名为retVal的变量中,我已经在正确的过程中赋予了doc值。

虽然文档显示成功,但不知何故它没有被分配给名为retVal的变量。

请对主题进行一些说明,以便从名为giveData()

的函数返回文档集合

谢谢和问候。

2 个答案:

答案 0 :(得分:0)

您需要更熟悉Node.js的异步流程 - this may help, for example

您的底部console.log并且在您的作业<{strong> 之前发生

mongoClient的所有函数都是异步的,返回应该在赋值后立即发生(在获取集合retVal = doc;之后发生)。

代码会转到您当前的employees,而无需等待return的数据。

可以重构所有代码以使用node.js回调。当然有很多优雅的方法来解决它,但只是为了向你展示一些例子。

db.collection('employees')

答案 1 :(得分:0)

在本节中

var retVal;  // this is a return value which will contain documents

retVal未定义

在底部

return retVal;  // this may return data from the server but is returning undefined 

retVal仍未定义,因为对mongoClient.connect的调用是异步的

您在特定时刻返回retVal。该值不会改变。

您应该将回调函数传递给giveData,这样您就可以在收到回复数据后访问它。

var giveData = function(callback) {
  var mongodb = require('mongodb');
  var mongoClient = mongodb.MongoClient;

  var url = 'mongodb://127.0.0.1:27017/ngs' 

  mongoClient.connect(url, function(err, db) {
    if (err) {
      callback(err)
    } else {
      db.collection('employees').find().toArray(function(err, doc) {
        if(err) {
          callback(err)
        } else {
          callback(null, doc)
        }
      })
    }       
  }

}

module.exports = {  
  showMessage: showMessage,
  giveData: giveData
}

而不是像这样使用

giveData(function(err, doc) {
  if(err) {
    // handle error
  } else {
    // you can now use doc!
  }
})