从分析类传递现有对象,否则创建一个新对象

Pass exisiting Object from Parse Class otherwise create a new object

本文关键字:对象 创建 新对象 一个      更新时间:2023-09-26

截至目前,我有一个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);

如果将这些用于所有电子邮件对象的创建,则不再需要(或不需要)该类的beforeSave钩子。我想知道是否有比这个更好的解决方案,但我认为这是目前能做的最好的解决方案。