Parse.com beforeDelete函数失败并且“未成功/错误被调用”

时间:2015-09-29 13:26:10

标签: javascript parse-platform

这不是最好的parse.com问题,但这是我第一次用javascript编写内容而我无法弄清楚是什么问题。

在我的数据库中,我有ParsePost个,ParseUser个和ParseComment个。当我删除帖子时,我希望完成以下操作:

  • 任务1:找到撰写帖子的用户,并减少他的“帖子”计数器;
  • 任务2:删除与要删除的帖子相关的所有ParseComment;
  • 任务3:找到“喜欢”帖子的用户,并减少他们的“喜欢”计数器。

我正在尝试如下(重命名一些变量以便可能存在拼写错误):

Parse.Cloud.beforeDelete("ParsePost", function(request,response) {
  var post = request.object;
  var user = post.get("author");
  user.increment("posts",-1);
  user.save().then(function(success) {

    var query = new Parse.Query("ParseComment");
    query.equalTo("post",post);
    return query.find();

  }).then(function(comments) {
    for (var i = 0; i < comments.length; i++) {
      var comment = comments[i];
      comment.destroy();
    }

    var query2 = new Parse.Query("ParseUser");
    query2.equalTo("postsLiked",post); //"postsLiked" is a relation field
    return query2.find();

  }).then(function(users) {
    for (var i = 0; i < users.length; i++) {
      var u = users[i];
      u.increment("postsLikedCount",-1);
      u.save();
    }
    response.success();
  });
});

但是,删除失败并显示以下消息:Result: success/error was not called。我不明白为什么。

就我所理解的(不多),我处理承诺的方式应该调用下一个then(),即使之前的某个步骤中存在错误。换句话说,这三个任务并不是真正重要的 - 我希望函数能够:

  • 尝试完成每项任务;
  • 调用成功(),无论任务的输出如何:我希望删除帖子,即使comments.length == 0

我应该如何做到这一点,以及为什么我的功能没有达到response.success()

作为旁注,我甚至没有找到一种调试方法 - 我使用parse deploy然后查看parse.com中的logs部分,但我无法在其中写入任何内容。即,console.log()没有输出。

1 个答案:

答案 0 :(得分:1)

你的一个承诺是抛出一个错误,而你没有任何.then()可以捕获这个错误。 .then()要么带有1个或2个参数,这两个参数都是函数。如果只有1,它将获取promise的已解析值。如果有2,则第二个获取承诺的拒绝值。你的一个承诺被拒绝,但承诺永远不会被抓住。将其添加到链的末尾:

.then( function(){},
        function(error)
        {
             response.error("There was an error: " + error.message);
        }
    );

拒绝的promise会跳过promise链中不包含错误处理程序的任何链接,因此在最后使用这一个链接会捕获早期链接中的任何错误。即使您调用response.success()并且不返回promise,也会调用下一个链的成功函数。你只是没有把任何东西传递给变量,所以它将是null / undefined

编辑 - 看看你的代码,我敢打赌它很早就会成为一个问题。你从来没有提取过用户,所以它只是一个空对象,现在只有一个对象id。

Edit2 - 此外,query.find()仅返回前1000个结果。如果你想对每个对象做一些事情,你应该使用query.each()。