同步Jake Node.js任务

时间:2013-02-05 21:19:21

标签: node.js asynchronous jake

在将两个模型添加到数据库后,有人可以帮我关闭数据库吗?我试过读

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

Node.js and Jake - How to call system commands synchronously within a task?

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

但似乎仍无法弄明白。以下是自述文件的摘录

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

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

就像现在一样,它甚至在打开它之前就关闭了连接。

// 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模块中的并行流来完成我的目标。

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

EDIT2: 所以我真的非常感谢所有的帮助。我也看到你是parseq :)的维护者。谢谢!我仍在努力完成这最后一点,我的功能是悬挂,而不是在功能5完成时调用done()。我确定我错误地称这个'这个'。有什么建议吗?

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');
    }
);

1 个答案:

答案 0 :(得分:1)

两个保存功能完成后,您需要调用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');
    });
});

然后,您应该开始研究流程控制库,以使代码更简单。

使用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');
  }
);

有选择地忽略一些错误,这是一个函数的样子:

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);
      }
    });
  }