Sequelizejs模型创建回调没有同步运行?

时间:2014-12-20 13:17:47

标签: node.js postgresql asynchronous synchronous sequelize.js

我在Sequelize申请中使用PostgreSQLnode.js。我有两个一对一的关系表 - CustomersUsers

UserId表中有外键{​​{1}}。因此,我首先插入Customers表格,然后然后插入Users,最后插入Customers。这是我的控制器代码:

UserId

我使用async.each()同步循环2个记录的数组。插入两条记录时,控制台输出为:

var self = this;

async.each(data, function(row, callback) {
    var userData = {
        name: row.name,
        /** **/
    }
    // self.User is User model
    self.User.create(userData).then(function(user) {
      console.log("[User.create] succeeded");
      /** **/
      // self.Model is Customer model
      self.Model.create(cusData).then(function(customer) {
          console.log("[Customer.create] succeeded");
          /** **/
      }).catch(function(err) {
          throw err;
      }); // EOL self.Model.create
    }).catch(function(err) {
          throw err;
    }); // EOL self.User.create
    callback();
}, function(err){
    if (err) {
        throw err;
    }
}

我的期望是:

[User.create] succeeded
[User.create] succeeded
[Customer.create] succeeded
[Customer.create] succeeded

我认为这可能是异步编程中同步流的问题。我错了什么?我想我正确使用了回调。

1 个答案:

答案 0 :(得分:1)

您以异步方式启动两个插入内容,因此您无法保证后续查询的顺序。据您所知,根据锁定,您可以获得当前或预期的结果。

要强制执行订单,请在内部回调中从向前移动迭代:

  self.Model.create(cusData).then(function(customer) {
      console.log("[Customer.create] succeeded");
      /** move the iterator forward here, using e.g. recursion **/
  })