将callback转换为thunk

我用koa.js使用mongoose(也许是一个不好的select,但必须坚持下去)。 我最初的callback函数是:

var _project = yield parse(this); var userdetails = this.req.user; var that = this ; //============================================================= //FInd a user , check the project name exists under the user, if not then create one //============================================================= User.findOne({ '_id': userdetails._id }, function (err, user) { if (err) { this.body = "please login again , your session seems to have expired" } console.log(user.projects.owner.indexOf(_project.name)); if(user.projects.owner.indexOf(_project.name) == -1) { //This means the project is not yet created var temp_project = new Project(_project); temp_project.save(function save() { if(err) { that.body = "Project coudn't be saved, Please try again sometime later"; } else { user.projects.owner.push(_project.name); user.save(function save() { if (err) { that.body = "This error is highly unlikely, yet if you see this .Please report this issue"; } }); that.body = temp_project; } }); } if(user.projects.owner.indexOf(_project.name) >= 0) { //THis means the project exists that.body = "You have already created a project with same name, please use a different name"; console.log("you reached till here"); } }); 

这应该在正常的快递世界,但后来我意识到,我需要重写thunk的forms,所以我目前的尝试是

 function userfindONE(err, user) { if (err) { return "please login again , your session seems to have expired" } if(user.projects.owner.indexOf(tproject.name) == -1) { //This means the project is not yet created var temp_project = new Project(tproject); temp_project.save(function save() { if(err) { return "Project coudn't be saved, Please try again sometime later"; } else { user.projects.owner.push(tproject.name); user.save(function save() { if (err) { return "This error is highly unlikely, yet if you see this .Please report this issue"; } }); return temp_project; } }); } if(user.projects.owner.indexOf(tproject.name) >= 0) { //THis means the project exists return "You have already created a project with same name, please use a different name"; } else return "nothing is matching"; } function userfindone(userdetails) { return function(cb) { User.findOne({ '_id': userdetails._id }, cb); }; } var userdetails = this.req.user; var tproject = yield parse(this); 

但是,这将从第一个mongoose调用中的User.findone返回用户详细信息。 而其他任何东西似乎都被忽略了。 谢谢

 this.body = yield userfindone(userdetails)(userfindONE) ; 

看看node-thunkify 。 它应该像包装你的模式的function一样简单。

使用Mongoose 3.9.x,你可以简单地yield user.save() ,检查你已经安装了unstable版本的package.json。