Javascript 解析云-删除属性(指针)

Javascript 解析云-删除属性(指针),javascript,parse-platform,Javascript,Parse Platform,我的数据模型由3个对象组成,其中两个(子对象)使用指针链接到父对象 MyModel是具有两个属性的父对象:颜色和目标。两者都是指向其他对象的指针 当我删除父对象时,我希望子对象也被删除,警告是指针可能为nil,因此在尝试删除之前,我需要检查是否存在某些内容 [我不熟悉Javascript,所以这可能也是问题的一部分] Parse.Cloud.beforeDelete("MyModel", function(request) { if request.has(request.object.

我的数据模型由3个对象组成,其中两个(子对象)使用指针链接到父对象

MyModel是具有两个属性的父对象:颜色和目标。两者都是指向其他对象的指针

当我删除父对象时,我希望子对象也被删除,警告是指针可能为nil,因此在尝试删除之前,我需要检查是否存在某些内容

[我不熟悉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);
          }
        });
  }
});

让我们将其分解成更小的函数,并在此过程中纠正操作代码中的几个问题。将事情简化为更小的承诺返回函数非常有帮助,可以保持代码模块化和并发性的可管理性

编辑 通常,最好使用指针来关联对象。下面是一个通用函数,用于通过指针删除相关对象:

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
方法很容易编写和理解。(假设通过指针的关系):

另一个需要注意的重要事项是,before钩子接受响应对象,并且需要在相关任务完成后调用该对象上的success/error


所有这些都取决于承诺,这些承诺是必要的,也是非常有用的

问题的文本意味着
颜色
目标
是单一的,只是指向另一个对象的单个指针。但是“颜色”的复数命名让我感到奇怪。代码使用
destroyAll()
,它需要销毁一个数组(复数)。你能澄清一下吗?是的,它们是单数的。颜色包含textColor和bgColor,这是命名的原因,但它是一个对象。
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);
    });
}