在保存更新类之前分析云

Parse cloud beforeSave update class

本文关键字:保存 更新      更新时间:2024-03-03

Parse上有一个名为Profiles的类,它包含一个布尔列isDefault

基本上,我试图实现的是,如果在Profiles上调用save,我希望在保存之前检查添加/更新的对象,如果是isDefault,则将Profiles中的所有其他行更改为false,然后保存新的或更新的对象。

对于这个场景,我使用了beforeSave,除了它不运行更新所有Profiles数据的查询之外,所有的东西都在beforeSave中工作,下面是我使用的代码:

Parse.Cloud.beforeSave("Profiles", function(request, response) {

    if (request.object.get("imageUrl") == null || request.object.get("imageUrl") == "") {
    request.object.set("imageUrl", "http://www.imran.com/xyper_images/icon-user-default.png");
    }
  if (!request.object.get("isDefault")) {
    request.object.set("isDefault", false);
  }else{
    var query = new Parse.Query("Profiles");
      query.equalTo("user", request.object.get("user"));
      query.find().then(function(results) {
            for (var i = 0; i < results.length; i++) { 
              var pro = results[i];
              pro.set("isDefault", false);
              pro.save();
            }
        }
      ); 
  }
  response.success();
});
请注意,在Javascript SDK中,save()是一个异步方法,它返回promise(https://parse.com/docs/js/symbols/Parse.Object.html#save)。

在您的代码中,response.success()可能在对所有对象完成save()操作之前返回。

平行承诺

我会通过使用并行承诺来解决这个问题(您也可以尝试使用串行承诺或使用saveAll方法的方法):

var query = new Parse.Query("Profiles");
query.equalTo("user", request.object.get("user"));
query.find().then(function(results) {
    var promises = [];
    for (var i = 0; i < results.length; i++) {
        var pro = results[i];
        pro.set("isDefault", false);
        promises.push(pro.save());
    }
    return Parse.Promise.when(promises);
}).then(function(result) {
    response.success();
},function(error){
    response.error(); 
});

全部保存

下面是一个使用saveAll方法的解决方案。根据Parse JS文档,saveAll()不会返回promise。所以这里的语法有点混乱(我不喜欢像这里那样混合promise,但我不想过多地修改您的原始代码)。

var query = new Parse.Query("Profiles");
query.equalTo("user", request.object.get("user"));
query.find().then(function(results) {
    for (var i = 0; i < results.length; i++) {
        var pro = results[i];
        pro.set("isDefault", false);
    }
    Parse.Object.saveAll(results, {
        success: function(list) {
            response.success();
        },
        error: function(error) {
            response.error();
        }
    });
}, function(error){
    response.error();
});