从 Parse Class 传递现有对象,否则创建一个新对象
Pass exisiting Object from Parse Class otherwise create a new object
截至目前,我有一个 beforeSave 函数可以防止重复的电子邮件被保存,如下所示。
Parse.Cloud.beforeSave("Email", function(request, response) {
var query = new Parse.Query("Email");
// Gets the email key value (string) before object is saved
query.equalTo("address", request.object.get("address"));
// Checks to see if an object for that email already exists
query.first({
success: function(object) {
if (object) {
response.error("Email already Exists");
} else {
response.success();
}
},
error: function(error) {
response.error("Could not determine if this email exists");
}
});
});
创建电子邮件的功能,但如果有人将电子邮件地址添加到我们之前保存的他们的项目中,这将破坏该功能,并最终破坏该功能存在的承诺链,至少在我看来是这样。
function createEmails(emails) {
var EmailsClass = Parse.Object.extend("Email");
var toSave = _.map(emails, function(emailAddress) {
var email = new EmailsClass();
email.set("address", emailAddress);
return email;
});
return Parse.Object.saveAll(toSave);
}
希望有人有比这更好的答案,但似乎避免节省 beforeSave
的唯一方法是响应错误,这会使后续处理变得混乱。
因此,如果尝试创建副本从应用程序的角度来看不是错误,只是一个不允许的条件,那么我认为您必须在 beforeSave
之前通过过滤输入来捕获它重复。
批量创建的时候不太漂亮,但它会是这样的:
// answer a promise for an existing email object with address==email or a promise to save a new one
function fetchOrCreateEmail(emailAddress) {
var EmailsClass = Parse.Object.extend("Email");
var query = new Parse.Query(EmailsClass);
query.equalTo("address", emailAddress);
return query.first().then(function(object) {
if (!object) {
object = new EmailsClass();
object("address", emailAddress);
return object.save();
} else {
return Parse.Promise.as(object);
}
});
}
// create Email objects with a given array of addresses, creating
// objects only for unique addresses
function createEmails(emails) {
var toSave = _.map(emails, fetchOrCreateEmail);
return Parse.Promise.when(toSave);
}
有了这个fetchOrCreateEmail
功能,你可以如图所示批量创建,或者像这样创建单个:
fetchOrCreateEmail(emailAddress);
如果您将这些用于所有电子邮件对象的创建,您将不再需要(或不需要)该 class 的 beforeSave
挂钩。我想看看是否有比这个更好的解决方案,但我认为这是目前最好的解决方案。
截至目前,我有一个 beforeSave 函数可以防止重复的电子邮件被保存,如下所示。
Parse.Cloud.beforeSave("Email", function(request, response) {
var query = new Parse.Query("Email");
// Gets the email key value (string) before object is saved
query.equalTo("address", request.object.get("address"));
// Checks to see if an object for that email already exists
query.first({
success: function(object) {
if (object) {
response.error("Email already Exists");
} else {
response.success();
}
},
error: function(error) {
response.error("Could not determine if this email exists");
}
});
});
创建电子邮件的功能,但如果有人将电子邮件地址添加到我们之前保存的他们的项目中,这将破坏该功能,并最终破坏该功能存在的承诺链,至少在我看来是这样。
function createEmails(emails) {
var EmailsClass = Parse.Object.extend("Email");
var toSave = _.map(emails, function(emailAddress) {
var email = new EmailsClass();
email.set("address", emailAddress);
return email;
});
return Parse.Object.saveAll(toSave);
}
希望有人有比这更好的答案,但似乎避免节省 beforeSave
的唯一方法是响应错误,这会使后续处理变得混乱。
因此,如果尝试创建副本从应用程序的角度来看不是错误,只是一个不允许的条件,那么我认为您必须在 beforeSave
之前通过过滤输入来捕获它重复。
批量创建的时候不太漂亮,但它会是这样的:
// answer a promise for an existing email object with address==email or a promise to save a new one
function fetchOrCreateEmail(emailAddress) {
var EmailsClass = Parse.Object.extend("Email");
var query = new Parse.Query(EmailsClass);
query.equalTo("address", emailAddress);
return query.first().then(function(object) {
if (!object) {
object = new EmailsClass();
object("address", emailAddress);
return object.save();
} else {
return Parse.Promise.as(object);
}
});
}
// create Email objects with a given array of addresses, creating
// objects only for unique addresses
function createEmails(emails) {
var toSave = _.map(emails, fetchOrCreateEmail);
return Parse.Promise.when(toSave);
}
有了这个fetchOrCreateEmail
功能,你可以如图所示批量创建,或者像这样创建单个:
fetchOrCreateEmail(emailAddress);
如果您将这些用于所有电子邮件对象的创建,您将不再需要(或不需要)该 class 的 beforeSave
挂钩。我想看看是否有比这个更好的解决方案,但我认为这是目前最好的解决方案。