Javascript 使用回调
我试图使用回调从数据库中获取查询结果,但仍然返回未定义的结果。代码如下:Javascript 使用回调,javascript,node.js,mongodb,callback,Javascript,Node.js,Mongodb,Callback,我试图使用回调从数据库中获取查询结果,但仍然返回未定义的结果。代码如下: function onComplete(x){ return x; } function getRecords(callBack){ mongo.MongoClient.connect("mongodb://localhost:27017/nettuts", function(err, db){ if(err){ console.log(err);
function onComplete(x){
return x;
}
function getRecords(callBack){
mongo.MongoClient.connect("mongodb://localhost:27017/nettuts", function(err, db){
if(err){
console.log(err);
return;
}
console.log('Connected to mongo');
db.collection('nettuts').find().toArray(function(err, records){
if(typeof callBack === "function"){
callBack(records);
}
});
});
}
app.get('/', function (req, res) {
var records = getRecords(onComplete);
console.log(records);
res.render("index", {title: "Hello!", people: records});
});
在最后一行的第三行,我得到了一个未定义的函数。如前所述,异步编程的方法是错误的,如果要“重用”,则将回调传递给正在使用的函数,而不是相反的方法:
var mongo = require("mongodb"),
MongoClient = mongo.MongoClient;
function getRecords(db,callback) {
if (typeof callback !== 'function')
throw "getRecords() requires a callback as the second arg";
db.collection("test").find().toArray(function(err,records) {
callback(err,records);
});
}
MongoClient.connect('mongodb://localhost/test',function(err,db) {
getRecords(db,function(err,result) {
if (err) throw err;
console.log(result);
});
});
这里还要注意的是,您的任何活动代码都需要在连接存在之后发生,太广泛了,无法在这里介绍实现这一点的最佳方法。但是您肯定不会与每个请求建立连接,因为这将非常糟糕
然后,“可重用”函数只接受连接详细信息和操作完成后希望实现的实际功能。这是回调的基本原则。在异步代码中不返回或分配内容;您是以连续传递样式编写的,因此
var records=getRecords(onComplete)
没有意义,除非getRecords
返回一个承诺,在这种情况下console.log(records)
不起作用,您必须再次使用回调。移动res.render()
调用回调。那么我如何才能获取记录并在另一个函数中使用它呢?通过在getRecords
回调中调用该函数。