Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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_Asynchronous - Fatal编程技术网

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

如何从node.js中的异步函数返回值,node.js,asynchronous,Node.js,Asynchronous,我最近开始学习中文。我有以下代码返回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

我最近开始学习中文。我有以下代码返回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的函数返回文档集合


感谢和问候。

您需要更加熟悉Node.js-的异步流

您的底部console.log和return发生在分配retVal=doc之前

mongoClient的所有功能都是异步的,并且返回应该在获取集合雇员后发生的分配之后立即发生

代码将继续执行当前返回,而无需等待db.collection'employees'中的数据

所有代码都可以重构为使用node.js回调。当然,有很多非常优雅的方法来解决这个问题,但只是给你们举个例子

   var retVal;
   function getEmployees(cb) {
        return mongoClient.connect(url, function(err, db) {
             if (err) return cb(err);
             db.collection('employees').find().toArray(
                 function(err, doc){
                     if(err) return cb(err);
                     console.log(doc); 
                     cb(null,doc); 
                  });
          });
        }

 getEmployees((err, result) => {
      if (err) console.log('Error:',err);
      retVal = result;
      return retVal;
 });
在本节中

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!
  }
})

你的回答很有针对性。你能解释一下callbackerr和callBacknull吗,博士?我认为这将有助于我理解异步nodej。谢谢。这是处理回调的节点约定。您自己在mongoClient.connect中使用了它。基本上,第一个参数总是错误,这是你应该检查的第一件事。如果一切顺利,没有错误,你发送null来指定没有错误,因此回调null,博士。谢谢Yoni Levy。但我仍然无法理解,如果没有错误,如何从给定数据返回值。基本上,我想要的是从函数返回一个值,该值应该包含来自MongoDb的数据。您需要先传递回调并在其中检查错误,如果有错误,然后以您认为合适的方式处理它。如果没有错误,您就有包含所需数据的doc参数。你真的应该阅读更多关于js中异步操作和回调的内容,这是一些基本的东西,但在这里的评论部分有太多的内容要介绍。@NizamuddinShaikh读一下