我在Sequelize申请中使用PostgreSQL和node.js。我有两个一对一的关系表 - Customers
和Users
。
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
我认为这可能是异步编程中同步流的问题。我错了什么?我想我正确使用了回调。
答案 0 :(得分:1)
您以异步方式启动两个插入内容,因此您无法保证后续查询的顺序。据您所知,根据锁定,您可以获得当前或预期的结果。
要强制执行订单,请在内部回调中从向前移动迭代:
self.Model.create(cusData).then(function(customer) {
console.log("[Customer.create] succeeded");
/** move the iterator forward here, using e.g. recursion **/
})