如何在不触发模型生命周期回调的情况下更新SailsJS中的记录
How to update record in SailsJS without triggering model lifecycle callbacks
我有一个模型,在更新或将新记录保存到表后,我需要重建记录。问题是在fixTree进行更新时触发了afterUpdate回调。
module.exports = {
identity: 'Role',
attributes: {
..
},
afterCreate: function(rec, cb) {
fixTree();
cb();
},
afterUpdate: function(rec, cb) {
fixTree();
cb();
},
}
function fixTree() {
/* code here */
Role.update(....); // <--- do not trigger afterUpdate
/* and code here */
}
我最终使用了控制器动作
create: function(req, res) {
var data = {};
data.name = req.body.name;
data.parent = req.body.parent;
Role.create(data, function(err, record) {
Role.tree.fix(function() {
res.ok(record);
});
});
},
update: function(req, res) {
var data = {};
data.name = req.body.name;
data.parent = req.body.parent;
Role.update(req.params.id, data, function(err, record) {
Role.tree.fix(function() {
res.ok(record);
});
});
},
您可以添加一个标志来监控是否正在进行树更新:
var fixTreeInProgress = false;
module.exports = {
identity: 'Role',
attributes: {
//..
},
afterCreate: function(rec, cb) {
if (!fixTreeInProgress) {
fixTree();
}
cb();
},
afterUpdate: function(rec, cb) {
if (!fixTreeInProgress) {
fixTree();
}
cb();
},
}
function fixTree() {
/* code here */
fixTreeInProgress = true;
//passing callback to clear out flag when update is complete
Role.update(criteria, updatedRecords, function fixTreeUpdateCallback() {
fixTreeInProgress = false;
}); // <--- do not trigger afterUpdate
/* and code here */
}
但请记住:如果在Role.update进行期间,数据将在另一个请求中更新,则会使您的数据不一致:
考虑这样的场景:
- 应用程序收到数据更新请求
- 控制器更新数据,调用生命周期回调
fixTreeInProgress
var为false
,因此我们启动fixTree()
,并将fixTreeInProgress
设置为true
- 应用程序又收到一个数据更新请求
- 控制器更新数据,调用生命周期回调,
fixTreeInProgress
var为true
,因此我们不启动fixTree()
- Role.update()完成,
fixTreeInProgress
设置为false
在这种情况下,我们将使用旧版本的数据更新树。
您需要使用某种任务队列(以及可选的某种反跳功能)来处理这种情况。
相关文章:
- 如何在没有回调的情况下获取有关元素的信息
- 在没有大量回调函数的情况下在列表元素上循环播放同一动画
- 如何在没有空回调的情况下测试多个调用
- ReactJs:this.setState的情况下不调用回调函数
- 如何在Angular中设置异步HTTP服务的回调,以便在不定义数组的情况下在控制器中填充数组
- 如何在不向现有JavaScript函数添加代码的情况下向该函数添加回调函数
- 返回按钮回调函数在特定情况下失败或未启动
- 在这种情况下,如何使用参数添加回调
- 未定义的返回值.在这种情况下如何使用回调
- 在什么情况下浏览器拒绝继续调用 setInterval 回调
- 如何在不传递回调函数的情况下将嵌套对象属性作为选项传递
- 在没有回调的情况下链接多个jquery事件
- 如何在不触发模型生命周期回调的情况下更新SailsJS中的记录
- 如何在不回调的情况下从SDK请求返回值
- 在这种情况下如何实现回调函数
- jquery '$.when':即使在出错的情况下如何触发'done'回调
- 在没有回调的情况下在ajax加载后启动jQuery脚本
- 如何在不执行回调函数的情况下将参数传递给回调函数
- jQuery:如何在不丢失默认参数的情况下为回调函数添加参数
- 是否可以在不创建全局回调函数的情况下异步初始化Google Maps ?