同步Jake Node.js任务

有两个模型添加到数据库后,有人可以帮我closures数据库吗? 我试过阅读

http://howtonode.org/intro-to-jake

Node.js和Jake – 如何在任务中同步调用系统命令?

和https://github.com/mde/jake上的github自述文件

但似乎无法弄清楚。 以下是自述文件的摘录

所有任务运行后清理,jake'complete'事件基本的'jake'对象是一个EventEmitter,并在运行所有任务后触发一个'complete'事件。 当任务启动一个保持Node事件循环运行的进程(例如数据库连接)时,这有时是有用的。 如果您知道在所有任务完成后要停止正在运行的Node进程,则可以为“完成”事件设置侦听器,如下所示:

jake.addListener('complete', function () { process.exit(); }); 

现在,它甚至在打开连接之前closures连接。

 // db connect var db = require('./schema'); desc('Seed MongoDB with initial data'); task('seed', [], function () { //******* Populate the database var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x }); user1.save(function(err) { if(err) { console.log(err); } else { console.log('user: '+user1.email +' saved'); } }); var user2 = new db.userModel({ email: 'x', password: 'x', phone: x }); user2.save(function(err) { if(err) { console.log(err); } else { console.log('user: '+user2.email +' saved'); } }); db.mongoose.connection.close(); console.log('Closed mongodb connection'); }); 

编辑:我能够完成我要使用从parseq模块并行stream。

 par( function() { fs.readFile("file1", this); }, function() { fs.readFile("file2", this); }, function done(err, results) { ... } ); 

编辑2:所以我真的很感谢所有的帮助。 我也看到你是parseq的维护者:)。 Thx的! 我仍然挣扎着最后一点,当函数5完成时,我的函数挂起而不是调用done()。 我确定我不正确地打电话给“这个”。 有什么build议?

 seq( function f1() { var user = new db.userModel({ email: 'x' , password: 'x' , phone: x }); user.save(this); }, function f2(err, value) { var user = new db.userModel({ email: 'x' , password: 'x' , phone: x }); user.save(this); }, function f3(err, value) { var merchant = new db.merchantModel({ name: 'x' , logourl: 'x' }); merchant.save(this); }, function f4(err, value) { var merchant = new db.merchantModel({ name: 'x' , logourl: 'x' }); merchant.save(this); }, function f5(err, value) { db.merchantModel.findOne({ name: 'x' }, function(err, merchant) { var coupon = new db.couponModel({ merchant_id: merchant.id , name: 'x' , imageurl: 'x' , expiration: Date.UTC(2013,3,15) }); //, expiration: new Date(2013,3,15) }); //alternate date creation method coupon.save(this); }); }, function done(err) { if(err) { console.log(err); } else { console.log('successfully seeded db'); } db.mongoose.connection.close(); console.log('Closed mongodb connection'); } ); 

两个保存函数完成后,您需要调用db.mongoose.connection.close 。 最简单的方法是嵌套保存调用(但不是最漂亮的)。

 var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x }); user1.save(function(err) { if(err) { console.log(err); } else { console.log('user: '+user1.email +' saved'); } var user2 = new db.userModel({ email: 'x', password: 'x', phone: x }); user2.save(function(err) { if(err) { console.log(err); } else { console.log('user: '+user2.email +' saved'); } db.mongoose.connection.close(); console.log('Closed mongodb connection'); }); }); 

然后,您应该开始查看stream量控制库,以使您的代码更简单。

同样的事情使用parseq:

 var seq = require("parseq").seq; seq( function f1() { var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x }); user1.save(this); }, function f2(err, value) { var user2 = new db.userModel({ email: 'x', password: 'x', phone: x }); user2.save(this); }, function done(err) { // check err here console.log('Closed mongodb connection'); } ); 

要有select地忽略一些错误,下面是一个函数的样子:

 function f1() { var self = this; var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x }); user1.save(function(err) { if (err === SOMETHING_TO_IGNORE) { self(null); else { self(err); } }); }