解析云之前保存更新类

时间:2015-02-21 11:21:38

标签: javascript android parse-platform

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

基本上我想要实现的是,如果在Profiles上调用了保存,我想在保存之前检查添加/更新的对象,如果它是{{1}如果为true,则将isDefault中的所有其他行更改为false,然后保存新的或更新的对象。

对于这种情况,我使用beforeSave,Everything在beforeSave中工作,除了它没有运行更新所有Profiles数据的查询,这里是我使用的代码:

Profiles

1 个答案:

答案 0 :(得分:1)

请注意,在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。所以这里的语法有点混乱(我不喜欢混合承诺,因为我已经在这里完成了,但我并不想过多地修改原始代码)。

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();
});