Javascript parse.com上的云代码跳过保存
我正在尝试建立一个允许随机玩家玩的游戏。下面的代码应该为两个配对的玩家创建一个GameMessage对象。为了将这两个对象关联为同一个游戏的一部分,我决定将字段“otherside”中为“firstplayer”制作的游戏的objectId保存为“secondplayer”,反之亦然。出于某种原因(可能在代码尝试检索ObjectId之前没有完成firstplayer和secondplayer的第一次保存,这意味着没有要获取的ObjectId?) 简短版本:“otherside”值为什么不保存Javascript parse.com上的云代码跳过保存,javascript,cloud,parse-platform,mbaas,Javascript,Cloud,Parse Platform,Mbaas,我正在尝试建立一个允许随机玩家玩的游戏。下面的代码应该为两个配对的玩家创建一个GameMessage对象。为了将这两个对象关联为同一个游戏的一部分,我决定将字段“otherside”中为“firstplayer”制作的游戏的objectId保存为“secondplayer”,反之亦然。出于某种原因(可能在代码尝试检索ObjectId之前没有完成firstplayer和secondplayer的第一次保存,这意味着没有要获取的ObjectId?) 简短版本:“otherside”值为什么不保存 P
Parse.Cloud.define("findpartner", function(request, response) {
var User = Parse.Object.extend("_User");
var user = new User();
var currentuser = Parse.User.current();
currentuser.set("searching", 0);
var query = new Parse.Query(User);
query.equalTo("searching", 1);
query.limit(50); //limit to at most 50 users
query.find({
success: function(objects) {
var amount = objects.length;
var indexNum = Math.floor((Math.random() * amount));
var newpartner = objects[indexNum];
if (amount > 0 && newpartner.id !=currentuser.id) {
newpartner.set("searching", 0);
var Firstplayer = Parse.Object.extend("GameMessages");
var firstplayer = new Firstplayer();
var Secondplayer = Parse.Object.extend("GameMessages");
var secondplayer = new Secondplayer();
firstplayer.set("sender", currentuser.id);
firstplayer.set("receiver", newpartner.id);
firstplayer.set("sent",0);
firstplayer.set("received",0);
firstplayer.set("receiverName", newpartner.getUsername());
secondplayer.set("sender", newpartner.id);
secondplayer.set("receiver", currentuser.id);
secondplayer.set("sent",0);
secondplayer.set("received",0);
secondplayer.set("receiverName", currentuser.getUsername());
firstplayer.save().then(function(secondplayer){ <<<
return secondplayer.save(); <<<
}).then(function(firstplayer_update) { <<<
return firstplayer.save({ otherside: secondplayer.id}); <<<
}).then(function(secondplayer_update){ <<<
return secondplayer.save({ otherside: firstplayer.id}); <<<
});
newpartner.save(null, {useMasterKey: true});
}
else {
currentuser.set("searching", 1);
}
currentuser.save();
response.success(amount);
},
error: function(error) {
alert("Error: " + error.code = " " + error.message);
}
});
});
Parse.Cloud.define(“findpartner”),函数(请求、响应){
var User=Parse.Object.extend(“_User”);
var user=新用户();
var currentuser=Parse.User.current();
currentuser.set(“正在搜索”,0);
var query=新建Parse.query(用户);
query.equalTo(“搜索”,1);
query.limit(50);//最多限制50个用户
查询.查找({
成功:功能(对象){
var amount=objects.length;
var indexNum=Math.floor((Math.random()*amount));
var newpartner=objects[indexNum];
如果(金额>0&&newpartner.id!=currentuser.id){
newpartner.set(“正在搜索”,0);
var Firstplayer=Parse.Object.extend(“GameMessages”);
var firstplayer=新的firstplayer();
var Secondplayer=Parse.Object.extend(“GameMessages”);
var secondplayer=新的secondplayer();
firstplayer.set(“sender”,currentuser.id);
firstplayer.set(“receiver”,newpartner.id);
firstplayer.set(“已发送”,0);
firstplayer.set(“已接收”,0);
set(“receiverName”,newpartner.getUsername());
secondplayer.set(“发送方”,newpartner.id);
secondplayer.set(“receiver”,currentuser.id);
secondplayer.set(“已发送”,0);
secondplayer.set(“已接收”,0);
set(“receiverName”,currentuser.getUsername());
firstplayer.save()。然后(函数(secondplayer){
你也可以用承诺来实现它。
更新:基于OP的问题编辑
试试这个
firstplayer.save()
.then(function(saved_firstPlayer){
firstplayer = saved_firstPlayer;
return secondplayer.save();
}).then(function(saved_secondplayer) {
secondplayer = saved_secondplayer;
return firstplayer.save({ otherside: secondplayer.id});
}).then(function(updated_firstplayer){
firstplayer = updated_firstplayer;
return secondplayer.save({ otherside: firstplayer.id});
}).then(function(updated_secondlayer){
secondplayer= update_secondplayer;
});
我不认为创建这两条独立的消息并将它们链接在一起是有意义的,但我不会让这妨碍它的工作。这没有经过测试,但我已经重构了您的代码,并认为您应该尝试从中收集一些东西
// Set this up once, outside of your function, and use it everywhere
var GameMessage = Parse.Object.extend("GameMessages");
Parse.Cloud.define("findpartner", function(request, response) {
// Code defensively, make sure this function requires a user be logged in.
if (!request.user) {
console.log("non-user called findpartner");
return response.error("Unauthorized.");
}
// Get the user who called the function
var user = request.user;
// The end response is a number, apparently
var result = 0;
// The target player
var targetPlayer;
// The two messages that will be used if a match is found
var firstmsg = new GameMessage();
var secondmsg = new GameMessage();
// Create a Users query
var query = new Parse.Query(Parse.User);
query.equalTo("searching", 1);
query.notEqualTo("objectId", user.id);
query.limit(50);
// Remove public access to Find operations for Users in the Data Browser
// Use the master key to query, and use promise syntax.
query.find({ useMasterKey: true }).then(function(objects) {
result = objects.length;
// If no users were found searching, mark the user as searching and save
if (result == 0) {
user.set('searching', 1);
// Return the save promise
return user.save(null, { useMasterKey: true });
}
// Pick a random user out of the response
var indexNum = Math.floor((Math.random() * objects.length));
var targetPlayer = objects[indexNum];
// Set that user to no longer be searching and save
targetPlayer.set("searching", 0);
return targetPlayer.save(null, { useMasterKey: true }).then(function() {
firstmsg.set("sender", user.id);
firstmsg.set("receiver", targetPlayer.id);
firstmsg.set("sent", 0);
firstmsg.set("received", 0);
firstmsg.set("receiverName", targetPlayer.getUsername());
secondmsg.set("sender", targetPlayer.id);
secondmsg.set("receiver", user.id);
secondmsg.set("sent", 0);
secondmsg.set("received", 0);
secondmsg.set("receiverName", user.getUsername());
// Return the promise result of saving both messages
return Parse.Object.saveAll([firstmsg, secondmsg], { useMasterKey: true });
}).then(function(messages) {
// Set the pointers to reference each other
firstmsg.set("otherside", secondmsg.id);
secondmsg.set("otherside", firstmsg.id);
// Return the promise result of saving both messages, again
return Parse.Object.saveAll([firstmsg, secondmsg], { useMasterKey: true });
});
}).then(function() {
// All the stuff above has finished one way or the other, now we just need to
// send back the result. 0 if no match was made.
response.success(result);
}, function(error) {
response.error(error);
});
});
有趣…我将用修改过的代码和可能不同的方法来组合一个答案。我尝试使用Promissions来编辑代码。它现在只保存第一个对象,没有“otherside”键。我在答案中添加了一个更新,请尝试一下。firstplayer.save()
不会使保存的对象在firstplayer
对象中可用。只有保存的对象才会有idwird。它仍然只保存firstplayer。我用这种方式编写的代码在parse.com上有什么限制吗?没有,没有这样的限制。所以根本就没有保存secondplayer?很好!只有最后一个括号在第70行“})。然后(函数(消息)){”需要删除。saveAll方法很好!一定错过了。我之所以将其设置为2条消息,是因为每个播放器上载一个文件和一些字符串,供其合作伙伴下载。我认为拥有2条消息要比将所有文件和字符串存储在一个对象中并尝试区分谁收到了什么更容易。
firstplayer.save()
.then(function(saved_firstPlayer){
firstplayer = saved_firstPlayer;
return secondplayer.save();
}).then(function(saved_secondplayer) {
secondplayer = saved_secondplayer;
return firstplayer.save({ otherside: secondplayer.id});
}).then(function(updated_firstplayer){
firstplayer = updated_firstplayer;
return secondplayer.save({ otherside: firstplayer.id});
}).then(function(updated_secondlayer){
secondplayer= update_secondplayer;
});
// Set this up once, outside of your function, and use it everywhere
var GameMessage = Parse.Object.extend("GameMessages");
Parse.Cloud.define("findpartner", function(request, response) {
// Code defensively, make sure this function requires a user be logged in.
if (!request.user) {
console.log("non-user called findpartner");
return response.error("Unauthorized.");
}
// Get the user who called the function
var user = request.user;
// The end response is a number, apparently
var result = 0;
// The target player
var targetPlayer;
// The two messages that will be used if a match is found
var firstmsg = new GameMessage();
var secondmsg = new GameMessage();
// Create a Users query
var query = new Parse.Query(Parse.User);
query.equalTo("searching", 1);
query.notEqualTo("objectId", user.id);
query.limit(50);
// Remove public access to Find operations for Users in the Data Browser
// Use the master key to query, and use promise syntax.
query.find({ useMasterKey: true }).then(function(objects) {
result = objects.length;
// If no users were found searching, mark the user as searching and save
if (result == 0) {
user.set('searching', 1);
// Return the save promise
return user.save(null, { useMasterKey: true });
}
// Pick a random user out of the response
var indexNum = Math.floor((Math.random() * objects.length));
var targetPlayer = objects[indexNum];
// Set that user to no longer be searching and save
targetPlayer.set("searching", 0);
return targetPlayer.save(null, { useMasterKey: true }).then(function() {
firstmsg.set("sender", user.id);
firstmsg.set("receiver", targetPlayer.id);
firstmsg.set("sent", 0);
firstmsg.set("received", 0);
firstmsg.set("receiverName", targetPlayer.getUsername());
secondmsg.set("sender", targetPlayer.id);
secondmsg.set("receiver", user.id);
secondmsg.set("sent", 0);
secondmsg.set("received", 0);
secondmsg.set("receiverName", user.getUsername());
// Return the promise result of saving both messages
return Parse.Object.saveAll([firstmsg, secondmsg], { useMasterKey: true });
}).then(function(messages) {
// Set the pointers to reference each other
firstmsg.set("otherside", secondmsg.id);
secondmsg.set("otherside", firstmsg.id);
// Return the promise result of saving both messages, again
return Parse.Object.saveAll([firstmsg, secondmsg], { useMasterKey: true });
});
}).then(function() {
// All the stuff above has finished one way or the other, now we just need to
// send back the result. 0 if no match was made.
response.success(result);
}, function(error) {
response.error(error);
});
});