var list = [];
db.posts.find({}, function(err, docs){
//console.log(docs);
list = docs;
});
yield this.render("index", {
posts: list
});
我有这个函数用于在从mongo db中提取一系列帖子后呈现页面。我知道这是因为javascript是异步的,但我似乎无法获得正确的订单(获取数组,然后呈现),而我所看到的解决方案似乎并不相似和koa一起为了在呈现页面之前获取数组,我将如何对其进行编码?
答案 0 :(得分:2)
尝试以下方法:
var list = yield db.posts.find({}).toArray();
console.log(list);
yield this.render("index", {posts: list});
答案 1 :(得分:0)
我不知道你正在使用什么mongodb库,但似乎该库只支持回调。
要使用synchronous
以yield
样式进行编程,您必须使用返回promises,thunk,generator等的函数(正如您在错误消息中看到的那样)。
您可以找到支持promises的mongodb库(我认为是mongoosejs),也可以包装您正在使用的库。
以下是将您的图书馆转换为可行格式的几个示例
// 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});