在渲染页面之后,Mongojs查询完成

var list = []; db.posts.find({}, function(err, docs){ //console.log(docs); list = docs; }); yield this.render("index", { posts: list }); 

我有这个函数从mongo数据库中拉出一个职位的数组后呈现一个页面。 我知道这是因为JavaScript是asynchronous的,但我似乎无法得到正确的命令(获取数组,然后渲染),我看到的解决scheme似乎没有与koa混合良好。 我将如何编码,以便在页面呈现之前获取数组?

我不知道你使用的是什么mongodb库,但似乎库只支持callback。

要使用yield来编写synchronous样式,必须使用返回promise,thunk,generator等的函数(正如您在错误信息中看到的那样)。

你可以find一个支持promise的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}); 

尝试以下操作:

 var list = yield db.posts.find({}).toArray(); console.log(list); yield this.render("index", {posts: list});