2015-01-26 72 views
0

我添加了一个beforeSave()解析云功能,该功能定义为无法正常工作。解析beforeSave()云代码功能不起作用

这里的背景是: 我有一个名为UserRewards类,有一个叫做ParseRelation的用户列。它由1个关系组成,它有一个单一的对象ParseUser。我有一个新的列pUser,我想在这个函数中设置。它查找用户的关系,找到其中的ParseUser,并将该用户设置为pUser

下面的代码我有

Parse.Cloud.beforeSave("UserRewards", function(request, response) { 
    var relation = request.object.relation("user"); 
    relation.query().find({ 
      success: function(list) { 
       console.log("looked up relation"); 
       if (list.length > 0) { 
        var pUser = list[0]; 
        request.object.set("pUser", pUser); 
        console.log("updated pUser"); 
       } 
      }, 
       error: function(error) { 
       console.error("unable to lookup relation"); 
      } 
    }); 
    response.success(); 

});

当我更新用户奖励行时,此函数被调用。但它什么都不做 - 没有任何控制台或错误日志。

任何想法?

回答

0

您的函数在查询完成前运行response.success(),从而取消它。试试...

Parse.Cloud.beforeSave("UserRewards", function(request, response) { 
    var relation = request.object.relation("user"); 
    relation.query().find({ 
      success: function(list) { 
       console.log("looked up relation"); 
       if (list.length > 0) { 
        var pUser = list[0]; 
        request.object.set("pUser", pUser); 
        console.log("updated pUser"); 
       } 
       response.success(); 
      }, 
       error: function(error) { 
       console.error("unable to lookup relation"); 
       response.error(error); 
      } 
    }); 
}); 

或者,看看容易在与承诺...

Parse.Cloud.beforeSave("UserRewards", function(request, response) { 
    var relation = request.object.relation("user"); 
    relation.query().find().then(function(list) { 
     console.log("looked up relation"); 
     if (list.length > 0) { 
      var pUser = list[0]; 
      request.object.set("pUser", pUser); 
      console.log("updated pUser"); 
     } 
     response.success(); 
    }, function(error) { 
     console.error("unable to lookup relation"); 
     response.error(error); 
    }); 
}); 

编辑我想我明白了后续问题的要求,以同步与关系属性的指针属性,假设在保存之前只设置了其中的一个。这可以通过检测关系为空来完成。如果是的话,再做一个异步步骤来获取指针...

Parse.Cloud.beforeSave("UserRewards", function(request, response) { 
    var relation = request.object.relation("user"); 
    relation.query().find().then(function(list) { 
     console.log("looked up relation"); 
     if (list.length > 0) { 
      var pUser = list[0]; 
      request.object.set("pUser", pUser); 
      console.log("updated pUser"); 
      return Parse.Promise.as(); // we're done, this will pass nothing to the next step 
     } else { // the relation is empty, so the user pointer must be set 
      var pointer = request.object.get("pUser"); 
      return pointer.fetch(); // this will pass the pUser to the next step 
     } 
    }).then(function(pUser) { 
     if (pUser) { 
      // must have found an empty relation in the last step. add the user pointer to it 
      request.object.relation.add(pUser); 
     } 
     response.success(); 
    }, function(error) { 
     console.error("unable to lookup relation"); 
     response.error(error); 
    }); 
}); 

(注意代码未经测试)。

+0

嗨丹,谢谢你的回答。那就是诀窍。我有一个后续问题。如果我想检查关系是否已设置,然后将指针设置为未设置,该怎么办?并设置关系,如果没有设置,但指针设置?随意修改上面的答案。承诺是好的。 – amit 2015-01-27 21:48:20

+0

@amit - 给了我最好的拍摄。 – danh 2015-01-27 22:31:54

+0

这样做的工作,如果关系是零? – amit 2015-01-27 23:46:52