我有Parse
CloudCode
beforeSave
个功能,大致如下:
response.success()
,这意味着代码可以继续并允许保存新用户; existing user
,获取group
对象并将existing user
添加到group
。为此,我使用链式承诺使代码更清晰。代码如下:
Parse.Cloud.beforeSave("Contact", function(request, response) {
var facebookID = request.object.get("facebookID");
var email = request.object.get("email");
var queryFb;
if (facebookID) {
queryFb = new Parse.Query(Parse.User);
queryFb.equalTo("facebookID", facebookID);
}
var queryEmail;
if (email) {
queryEmail = new Parse.Query(Parse.User);
queryEmail.equalTo("email", email);
}
var query;
if (facebookID && email) {
query = new Parse.Query.or(queryFb, queryEmail);
} else if (facebookID) {
query = queryFb;
} else {
query = queryEmail;
}
var user;
query.first().then(function(user) {
if (!user) {
response.success();
} else {
var groupQuery = new Parse.Query("Group");
groupQuery.equalTo("title", "ssAll");
groupQuery.equalTo("owner", request.user);
return groupQuery.first();
}
}).then(function(group) {
group.addUnique("contacts", user);
return group.save();
}).then(function(success) {
response.error("NOT ERROR - new object was NOT created");
}, function(error) {
response.error(error);
});
});
在我的测试用例中,查询返回!user
,因此调用了response.success()
消息 - 一切都很好。但是,这个响应似乎沿着promise链向下移动,这是针对查询返回user
对象的情况。因此,我的函数在行group.addUnique("contacts", user);
上以错误终止,因为group
对象显然是undefined
。
如何解决此问题?
答案 0 :(得分:1)
代码需要一些改进。关键的改进是为第二个promise的解决方案(第二个then
块)提供一致的起始条件。在没有现有用户的情况下,OP代码调用response.success()。这很好,除了执行仍然落到下一个分辨率,在一个案例中有一个未定义的group
参数。
新代码通过返回existingUser
(在群组更新后)或null
来修复此问题。 Null告诉下一个承诺解析调用success()
并允许保存继续,否则阻止保存。
另请注意, 错误,第一个块的user
参数与封闭范围中的var user
冲突。我尝试使用下面的变量命名来突出显示代码认为的两种不同类型的用户......
Parse.Cloud.beforeSave("Contact", function(request, response) {
var facebookID = request.object.get("facebookID");
var email = request.object.get("email");
// moved into a function so we can test and deal with it tersely
findUserByEmailOrFB(email, facebookID).then(function(existingUser) {
return (existingUser)? addContactToGroupOwnedBy(request.user, existingUser) : null;
}).then(function(existingUser) {
if (existingUser) {
response.error("NOT ERROR - new object was NOT created");
} else {
response.success();
}
}, function(error) {
response.error(error);
});
});
// find the group owned by ownerUser, add contactUser to its contacts return a promise fulfilled as contactUser
function addContactToGroupOwnedBy(ownerUser, contactUser) {
var groupQuery = new Parse.Query("Group");
groupQuery.equalTo("title", "ssAll");
groupQuery.equalTo("owner", ownerUser);
return groupQuery.first().then(function(group) {
group.addUnique("contacts", contactUser);
return group.save().then(function() { return contactUser; });
});
}
function findUserByEmailOrFB(email, facebookID) {
var queryFb;
if (facebookID) {
queryFb = new Parse.Query(Parse.User);
queryFb.equalTo("facebookID", facebookID);
}
var queryEmail;
if (email) {
queryEmail = new Parse.Query(Parse.User);
queryEmail.equalTo("email", email);
}
var query;
if (facebookID && email) {
query = new Parse.Query.or(queryFb, queryEmail);
} else if (facebookID) {
query = queryFb;
} else {
query = queryEmail;
}
return query.first();
}
答案 1 :(得分:1)
问题在于,无论是否检查用户成功(尚未使用此用户),您始终都在解决第一个承诺。但是,实际上你不必解决这个承诺。我建议你把这样的错误案例分开:
query.first().then(function(user) {
if (!user) {
response.success();
} else {
addUserToGroup(request.user).then(function() {
response.error("NOT ERROR - new object was NOT created");
}, function(error) {
response.error(error);
});
}
});
function addUserToGroup(user) {
var groupQuery = new Parse.Query("Group");
groupQuery.equalTo("title", "ssAll");
groupQuery.equalTo("owner", user);
return groupQuery.first().then(function(group) {
group.addUnique("contacts", user);
return group.save();
});
}
正如您所看到的,第一个承诺无法解决,因为无论如何都不会使用结果。