我的数据模型由3个对象组成,其中两个(子项)使用指针链接到父项。
MyModel是具有2个属性的父级:颜色和目标。两者都是指向其他对象的指针。
当我删除父母时我也希望删除子项,但需要注意的是指针可能是零,所以在尝试删除之前我需要检查是否有某些内容。
[我是Javascript的新手所以也许这也是问题的一部分]
Parse.Cloud.beforeDelete("MyModel", function(request) {
if request.has(request.object.colors) {
color = request.object.colors;
Parse.Object.destroyAll(color, {
success: function() {},
error: function(error) {
console.error("Error deleting related color " + error.code + ": " + error.message);
}
});
}
if request.has(request.object.goal) {
goal = request.object.goal;
Parse.Object.destroyAll(goal, {
success: function() {},
error: function(error) {
console.error("Error deleting related goal " + error.code + ": " + error.message);
}
});
}
});
答案 0 :(得分:1)
让我们把它分解成更小的函数,并在整个过程中纠正OP代码中的几个问题。将事物简化为更小的,承诺返回的函数非常有帮助,保持代码模块化和并发性可管理。
修改强> 通常,最好使用指针来关联对象。这是一个删除与指针相关的对象的通用函数:
function deleteRelatedPointer(myModel, pointerName) {
var pointer = myModel.get(pointerName);
if (pointer) {
return pointer.fetch().then(function(relatedObject) {
return relatedObject.destroy();
});
} else {
return null;
}
}
一些作者通过包含相关对象id的字符串列来关联对象。这是删除id:
相关对象的等效函数function deleteRelatedId(myModel, columnName, relatedClass) {
var relatedId = myModel.get(columnName);
if (relatedId) {
var query = new Parse.Query(relatedClass);
return query.get(relatedId).then(function(relatedObject) {
return relatedObject.destroy();
});
} else {
return null;
}
}
现在,beforeDelete
方法易于编写和理解。 (假设通过指针建立关系):
Parse.Cloud.beforeDelete("MyModel", function(request, response) {
var myModel = request.object;
deleteRelatedPointer(myModel, "colors").then(function() {
return deleteRelatedPointer(myModel , "goal");
}).then(function() {
response.success();
}, function(error) {
response.error(error);
});
}
另一个需要注意的重要事项是,before钩子需要一个响应对象,并且在相关任务完成后需要在该对象上调用成功/错误。
所有这一切都取决于承诺,这是必要且极其有用的。 Read about parse's implementation of them here