Javascript 呈现页面后Mongojs查询完成
我有这个函数用于在从mongo db中提取一组帖子后呈现页面。我知道这是因为JavaScript是异步的,但是我似乎无法得到正确的顺序(get数组,然后渲染),而且我所看到的解决方案似乎与膝关节炎没有很好的融合。为了在呈现页面之前获取数组,我应该如何编写此代码?请尝试以下操作:Javascript 呈现页面后Mongojs查询完成,javascript,node.js,mongodb,koa,Javascript,Node.js,Mongodb,Koa,我有这个函数用于在从mongo db中提取一组帖子后呈现页面。我知道这是因为JavaScript是异步的,但是我似乎无法得到正确的顺序(get数组,然后渲染),而且我所看到的解决方案似乎与膝关节炎没有很好的融合。为了在呈现页面之前获取数组,我应该如何编写此代码?请尝试以下操作: var list = []; db.posts.find({}, function(err, docs){ //console.log(docs); list = docs; }); yield thi
var list = [];
db.posts.find({}, function(err, docs){
//console.log(docs);
list = docs;
});
yield this.render("index", {
posts: list
});
我不知道您使用的是什么mongodb库,但该库似乎只支持回调 要使用
yield
以synchronous
风格编程,必须使用返回承诺、thunk、生成器等的函数(如错误消息中所示)
您可以找到一个支持promises的mongodb库(我认为是mongoosejs),也可以包装您正在使用的库
下面是几个将库转换为可行格式的示例
var list = yield db.posts.find({}).toArray();
console.log(list);
yield this.render("index", {posts: list});
它给了我
TypeError:您可能只生成一个函数、承诺、生成器、数组或对象,但传递了以下对象:“[object object]”
。我相信这是因为find()返回一个游标(流?),但我不知道如何从中读取代码>我使用的是mongojs,但thunkify方法无论如何都有效!谢谢
// Manually change callback to promise returning function
var Promise = require('bluebird');
function find(criteria){
var deffered, list;
deffered = Promise.defer();
db.posts.find(criteria, function(err, results){
if(err){
deffered.reject(err);
}
else{
deffered.resolve(result);
}
}
return deffered.promise;
}
// in your returning function do something like this
list = yield find({});
this.body = yield render('sometemplate', {posts: list});
// Thunk based solution
var thunkify = require('thunkify');
db.posts.find = thunkify(db.posts.find);
// now db.posts.find() returns a thunk which is yieldable
list = yield db.posts.find({});
this.body = yield render('sometemplate', {posts: list});