2015-09-29 71 views
0

這不會是最好的parse.com問題,但這是我第一次用javascript寫東西,我無法弄清楚怎麼了。Parse.com beforeDelete函數失敗,「成功/錯誤未被調用」

在我的db我有ParsePost s,ParseUser s和ParseComment s。當我刪除帖子,我想下面要做:

  • 任務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()即使有在之前的一個步驟錯誤的方式。換句話說,這三個任務都算不上後果 - 我想的功能:

  • 盡力去完成每一項任務;
  • 無論任務輸出如何,都會調用success():我想要刪除帖子,即使是,比如comments.length == 0

我應該怎麼做到這一點,爲什麼我的功能沒有達到response.success()

作爲一個方面說明,我甚至沒有找到調試的方法 - 我使用parse deploy,然後查看parse.com中的日誌部分,但我無法設法寫入任何內容。即,console.log()沒有輸出。

回答

1

你的承諾之一是拋出一個錯誤,並且你沒有任何.then()的錯誤。 .then()需要1或2個參數,這兩個參數都是函數。如果只有1個,它就會得到一個承諾的解決價值。如果有2個,那麼第二個承諾承諾的拒絕價值。你的承諾之一是被拒絕,但承諾永遠不會被抓住。添加到您鏈的末端:

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

拒絕承諾跳過不包含錯誤處理程序的承諾在任何環節,所以有在最後這一環節將捕獲任何錯誤從早期的鏈接。即使您調用response.success()並且不返回承諾,也會調用下一個鏈的成功函數。你只是不會將任何東西傳遞給變量,所以它將是空的/ undefined

編輯 - 看看你的代碼,我敢打賭這將是一個問題很早。你永遠不會抓取用戶,所以它只是一個空對象,現在只有一個對象ID。

Edit2 - 此外,query.find()只返回前1000個結果。如果你想對每一個對象做一些事情,你應該使用query.each()。

+0

非常感謝。我會隨機回答 - * edit1:*我從來不會對用戶調用get(),所以這不應該是個問題,對吧? *編輯2:*這是真的,我沒有想過。 *身體:*我明白了。調用'response.success()'而不是'response.error()'會不會很糟糕?如果你沒有從beforeDelete調用返回成功,當然,這些對象不會被刪除,但是我希望我的'Post'被刪除,即使有一個未被捕獲的東西在後面。 – natario

+0

我設法自己解決了這個問題,並重寫了我的大部分雲代碼。感謝您澄清解析承諾。 – natario

+0

有一件事我不是100%確定的。在上面的代碼(我的),例如,在'for(var i = 0; i natario

相關問題