这不是最好的parse.com问题,但这是我第一次用javascript编写内容而我无法弄清楚是什么问题。
在我的数据库中,我有ParsePost
个,ParseUser
个和ParseComment
个。当我删除帖子时,我希望完成以下操作:
ParseComment
; 我正在尝试如下(重命名一些变量以便可能存在拼写错误):
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()
没有输出。
答案 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()。