不要怂,就是干,撸起袖子干!

Commit 97ef72a9 by Mick Hansen

refactor queryInterface.delete to use promises rather than custom iterator

1 parent 3095a647
...@@ -612,7 +612,6 @@ module.exports = (function() { ...@@ -612,7 +612,6 @@ module.exports = (function() {
QueryInterface.prototype.delete = function(dao, tableName, identifier, options) { QueryInterface.prototype.delete = function(dao, tableName, identifier, options) {
var self = this var self = this
, restrict = false
, cascades = [] , cascades = []
, sql = self.QueryGenerator.deleteQuery(tableName, identifier, null, dao.Model); , sql = self.QueryGenerator.deleteQuery(tableName, identifier, null, dao.Model);
...@@ -623,70 +622,20 @@ module.exports = (function() { ...@@ -623,70 +622,20 @@ module.exports = (function() {
for (var i = 0; i < length; i++) { for (var i = 0; i < length; i++) {
if (dao.Model.associations[keys[i]].options && dao.Model.associations[keys[i]].options.onDelete) { if (dao.Model.associations[keys[i]].options && dao.Model.associations[keys[i]].options.onDelete) {
if (dao.Model.associations[keys[i]].options.onDelete === 'restrict') { if (dao.Model.associations[keys[i]].options.onDelete === 'cascade' && dao.Model.associations[keys[i]].options.useHooks === true) {
restrict = true; cascades.push(dao.Model.associations[keys[i]].accessors.get);
}
else if (dao.Model.associations[keys[i]].options.onDelete === 'cascade' && dao.Model.associations[keys[i]].options.useHooks === true) {
cascades[cascades.length] = dao.Model.associations[keys[i]].accessors.get;
} }
} }
} }
} }
return new Utils.Promise(function(resolve, reject) { return Promise.reduce(cascades, function (memo, cascade) {
var tick = 0; return dao[cascade]().then(function (instances) {
var iterate = function(err, i) { return Promise.reduce(instances, function (memo, instance) {
if (err) { return instance.destroy();
return reject(err); }, []);
} });
}, []).then(function () {
if (i >= cascades.length) {
return resolve();
}
dao[cascades[i]]().success(function(tasks) {
if (tasks === null || tasks.length < 1) {
if (i >= cascades.length) {
return resolve();
} else {
tick++;
return iterate(null, tick);
}
}
tasks = Array.isArray(tasks) ? tasks : [tasks];
var ii = 0;
var next = function(err, ii) {
if (!!err || ii >= tasks.length) {
return iterate(err);
}
tasks[ii].destroy().error(function(err) {
return iterate(err);
})
.success(function() {
ii++;
if (ii >= tasks.length) {
tick++;
return iterate(null, tick);
}
next(null, ii);
});
};
next(null, ii);
});
};
if (cascades.length > 0) {
iterate(null, tick);
} else {
resolve();
}
}).then(function() {
return self.sequelize.query(sql, dao, options); return self.sequelize.query(sql, dao, options);
}); });
}; };
......
...@@ -5580,37 +5580,32 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -5580,37 +5580,32 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
, beforeTask = false , beforeTask = false
, afterTask = false , afterTask = false
, beforeMiniTask = false , beforeMiniTask = false
, afterMiniTask = false; , afterMiniTask = false
, VeryCustomError = function() {};
this.Projects.beforeCreate(function(project, options, fn) { this.Projects.beforeCreate(function(project, options) {
beforeProject = true; beforeProject = true;
fn();
}); });
this.Projects.afterCreate(function(project, options, fn) { this.Projects.afterCreate(function(project, options) {
afterProject = true; afterProject = true;
fn();
}); });
this.Tasks.beforeDestroy(function(task, options, fn) { this.Tasks.beforeDestroy(function(task, options) {
beforeTask = true; beforeTask = true;
fn(new Error('Whoops!')); throw new VeryCustomError('Whoops!');
}); });
this.Tasks.afterDestroy(function(task, options, fn) { this.Tasks.afterDestroy(function(task, options) {
afterTask = true; afterTask = true;
fn();
}); });
this.MiniTasks.beforeDestroy(function(minitask, options, fn) { this.MiniTasks.beforeDestroy(function(minitask, options) {
beforeMiniTask = true; beforeMiniTask = true;
fn();
}); });
this.MiniTasks.afterDestroy(function(minitask, options, fn) { this.MiniTasks.afterDestroy(function(minitask, options) {
afterMiniTask = true; afterMiniTask = true;
fn();
}); });
return this.sequelize.Promise.all([ return this.sequelize.Promise.all([
...@@ -5623,14 +5618,14 @@ describe(Support.getTestDialectTeaser('Hooks'), function() { ...@@ -5623,14 +5618,14 @@ describe(Support.getTestDialectTeaser('Hooks'), function() {
project.addTask(task) project.addTask(task)
]).return(project); ]).return(project);
}).then(function(project) { }).then(function(project) {
return project.destroy(); return expect(project.destroy()).to.eventually.be.rejectedWith(VeryCustomError).then(function () {
}).catch(function() { expect(beforeProject).to.be.true;
expect(beforeProject).to.be.true; expect(afterProject).to.be.true;
expect(afterProject).to.be.true; expect(beforeTask).to.be.true;
expect(beforeTask).to.be.true; expect(afterTask).to.be.false;
expect(afterTask).to.be.false; expect(beforeMiniTask).to.be.false;
expect(beforeMiniTask).to.be.false; expect(afterMiniTask).to.be.false;
expect(afterMiniTask).to.be.false; });
}); });
}); });
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!