2015-03-04 2 views
3

У меня есть облачная функция, которая принимает запрос и создает объекты, а также связывает их в цепочку обещаний. Без beforeSave эта функция работает нормально, но beforeSave существует для предотвращения дублирования записей адресов электронной почты в классе электронной почты.beforeSave вызывает запросы возвращать ничего

ЗАПРОС

{ 
    "projectDescription": "Testing saveProject", 
    "projectTitle": "This is only a test, in the event of a real post   this will have an actual description", 
    "isEmailEnabled": true, 
    "shareEmails": [ 
    "[email protected]", 
    "[email protected]", 
    "[email protected]" 
    ], 
"userId": "1234" 
} 

ФУНКЦИЯ

Parse.Cloud.define("saveProject", function(request, response) { 

    var emails = request.params.shareEmails; 
    var user = request.params.userId; 
    var projectDescription = request.params.projectDescription; 
    var projectTitle = request.params.projectTitle; 
    var emailStatus = request.params.isEmailEnabled; 

    var ProjectClass = Parse.Object.extend("Project"); 

    var EmailsClass = Parse.Object.extend("Email"); 

    var EmailsClassAssignment = Parse.Object.extend("EmailAssignment"); 

    var project = new ProjectClass(); 

    var projectO; 

    var emailQueryArray; 

    project.set("title", projectTitle); 
    project.set("createdBy", { 
     "__type": "Pointer", 
     "className": "_User", 
     "objectId": user 
    }); 
    project.set("description", projectDescription); 
    project.set("status", true); 
    project.set("emailShareEnabled", emailStatus); 
    project.save().then(function(projectObject) { 

     projectO = projectObject; 
    }).then(function() { 
     emails.forEach(function(emailAddress) { 
      var email = new EmailsClass(); 

      email.set("address", emailAddress); 
      email.save(); 
     }); 
    }).then(function() { 

     emails.forEach(function(emailQuery) { 
      var queryEmail = new Parse.Query("Email"); 

      queryEmail.equalTo("address", emailQuery); 
      queryEmail.find().then(function(results) { 
       emailObject = results; 
       console.log(emailObject); 
      }); 
     }); 
    }); 
}); 

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("This email already exisits"); 
    } else { 
     response.success(); 
    } 
    }, 
    error: function(error) { 
    response.error("Could not determine if this email exists"); 
    } 
}); 
}); 

Есть ли способ объяснить BeforeSave в обратный вызов от сохранения объекта электронной почты, так что я могу гарантировать объект запрашивается?

Мне нужны объекты, которые должны быть там, чтобы я мог получить идентификатор для каждого и создать указатель в классе присвоений электронной почты.

Буду рад дополнительно объяснить любую часть кода или функцию в целом.

+0

Другой вопрос у меня есть, если его стоит проверить наличие дубликатов прямо в функции облака, а не с BeforeSave для того, чтобы контролировать порядок, а также допустить, что объект быть там до того, как я запрошу его идентификатор. Существуют ли какие-либо проблемы с производительностью и еще ли они масштабируемы? – mcclaskiem

+0

Я не вижу каких-либо 'beforeSave' или дубликатов в вашем коде. Я просто не понимаю? – JLRishe

+0

@JLRishe Я добавил код beforeSave под облачную функцию – mcclaskiem

ответ

1

save есть, как find, асинхронный способ. Чтобы подождать, пока они их не закончат, и чтобы заметить, были ли они сбой, вам нужно использовать Promise.when по всем обещаниям, которые были созданы в цикле. См. Parse JavaScript Promises within Loop not Completing и аналогичные вопросы.

Ваш код должен выглядеть следующим образом:

var ProjectClass = Parse.Object.extend("Project"); 
var EmailsClass = Parse.Object.extend("Email"); 
var EmailsClassAssignment = Parse.Object.extend("EmailAssignment"); 

Parse.Cloud.define("saveProject", function(request, response) { 
    var emails = request.params.shareEmails; 
    var user = request.params.userId; 
    var projectDescription = request.params.projectDescription; 
    var projectTitle = request.params.projectTitle; 
    var emailStatus = request.params.isEmailEnabled; 

    var project = new ProjectClass(); 
    project.set("title", projectTitle); 
    project.set("createdBy", { 
     "__type": "Pointer", 
     "className": "_User", 
     "objectId": user 
    }); 
    project.set("description", projectDescription); 
    project.set("status", true); 
    project.set("emailShareEnabled", emailStatus); 
    project.save().then(function() { 
     return Parse.Promise.when(emails.map(function(emailAddress) { 
//  ^^^^^^ ^^^^^^^^^^^^^^^^^^  ^^^ 
      var email = new EmailsClass(); 
      email.set("address", emailAddress); 
      return email.save(); 
//   ^^^^^^ 
     })); 
    }).then(function() { 
     return Parse.Promise.when(emails.map(function(emailQuery) { 
//  ^^^^^^ ^^^^^^^^^^^^^^^^^^  ^^^ 
      var queryEmail = new Parse.Query("Email"); 
      queryEmail.equalTo("address", emailQuery); 
      return queryEmail.find().then(function(results) { 
//   ^^^^^^ 
       console.log(results); 
      }); 
     })); 
    }); 
}); 
+0

Спасибо! Я новичок в использовании обещаний, а также Parse, поэтому это был отличный урок для обоих предметов! – mcclaskiem

Смежные вопросы