2015-05-14 2 views
1

Я просматриваю весь код облака, который я написал для своего приложения, и я уже нашел что-то, что мне нужно исправить. У меня есть база данных синтаксического анализа, заполненная пользователями и «встречающимися» объектами. Каждый пользователь может создавать или просматривать и принимать собрания. Следующая функция вызывается, когда пользователь хочет принять встречу. Если необходимое количество людей равно числу лиц, принявших собрание, они будут подтверждены, иначе он останется доступным для других пользователей. Сегодня я попытался принять встречу одновременно от 2-х клиентов, и встреча не подтвердилась. Конечно, требуемое количество человек было 2. Это функция, которую я звоню. Как я могу исправить это поведение?Parse.com Cloud Code: функция, вызываемая одновременно двумя пользователями

// accept meeting 
 
Parse.Cloud.define("acceptMeeting", function(request, response) { 
 
\t Parse.Cloud.useMasterKey(); 
 
\t var userAcceptingTheMeeting = request.user; 
 
\t var meetingId = request.params.meetingId; 
 
\t var meetingToAccept; 
 
\t var userCreatorOfMeeting; 
 
\t var changedObjects = []; 
 
\t var queryForMeeting = new Parse.Query("MeetingObject"); 
 
\t queryForMeeting.get(meetingId).then(function(meeting) { 
 
\t \t meetingToAccept = meeting; 
 
\t \t userCreatorOfMeeting = meeting.get("user"); 
 
\t \t // incrementing the "acceptedMeetings" number field on the database for the user that accepted the meeting 
 
\t \t userAcceptingTheMeeting.increment("acceptedMeetings", +1); 
 
\t \t changedObjects.push(userAcceptingTheMeeting); 
 
\t \t return changedObjects; 
 
\t }).then(function(changedObjects) { 
 
\t \t meetingToAccept.add("participantsObjectId", userAcceptingTheMeeting.id); 
 
\t \t meetingToAccept.add("participantsName", userAcceptingTheMeeting.get("username")); 
 
\t \t // if the length of the array containing all the participants is equal to the number required "meetingNumberOfPersons" then set "isAvailable" to false (the meeting is confirmed) 
 
\t \t if (meetingToAccept.get("participantsObjectId").length === meetingToAccept.get("meetingNumberOfPersons")) { 
 
\t \t \t meetingToAccept.set("isAvailable", false); 
 
\t \t } 
 
\t \t changedObjects.push(meetingToAccept); 
 
\t \t console.log(changedObjects.length); 
 
\t \t return changedObjects; 
 
\t }).then(function(saveChangedObjects) { 
 
\t \t return Parse.Object.saveAll(changedObjects); \t 
 
\t }).then(function(push) { 
 
\t \t // check if the meeting is still available 
 
\t \t if (meetingToAccept.get("isAvailable") === true) { 
 
\t \t \t 
 
\t \t \t // the meeting is still available, send a notification only to the creator of the meeting 
 
\t \t \t // push to the creator of the meeting 
 
\t \t \t 
 
\t \t } else if (meetingToAccept.get("isAvailable") === false) { 
 
\t \t \t 
 
\t \t \t // the meeting is confirmed, send notifications to everyone (creator and participants) 
 
\t \t \t // push to the creator of the meeting 
 
\t \t \t 
 
\t \t \t var participantsArray = []; 
 
\t \t \t participantsArray = meetingToAccept.get("participantsObjectId"); 
 
\t \t \t participantsArray.splice(participantsArray.indexOf(userAcceptingTheMeeting.id), 1); 
 
\t \t \t for (var i = 0; i < participantsArray.length; i++) { 
 
\t \t \t \t var participant = new Parse.User({ 
 
\t \t \t \t \t id: participantsArray[i] 
 
\t \t \t \t }); 
 
\t \t \t \t 
 
\t \t \t \t // push to the other participants 
 
\t \t \t \t 
 
\t \t \t } 
 
\t \t } \t 
 
\t \t return changedObjects; \t 
 
\t }).then(function(savedObjects) { 
 
\t \t if (meetingToAccept.get("isAvailable") === true) { 
 
\t \t \t response.success("unconfirmed"); 
 
\t \t } else { 
 
\t \t \t response.success("confirmed"); 
 
\t \t } 
 
\t }, function(error) { 
 
\t \t response.error("Failed to accept the meeting"); 
 
\t }); 
 
});

ответ

0

Я думаю, вы должны использовать .save() после .add()meetingToAccept.add("participantsObjectId", userAcceptingTheMeeting.id)

Рассмотрим последовательность событий:

{1} вызова acceptMeeting // Начало вызова 1, participantsObjectId = [] (пустой массив)

{2} называть acceptMeeting // Начало вызова 2, participantsObjectId = []

{1} называть meetingToAccept.add ("participantsObjectId", userAcceptingTheMeeting.id) // participantsObjectId = [user1]

{вызовов 2 } meetingToAccept.add ("participantsObjectId", userAcceptingTheMeeting.id) // т = 2 participantsObjectId = [пользователь2]

{1} называть meetingToAccept.get ("participantsObjectId"). проверка длины возвращает 1 // participantsObjectId = [пользователь2 ]

{звонок 2} meetingToAccept.get ("участникиObjectId"). Проверка длины возвращается 1

{1} называть Parse.Object.saveAll (changedObjects) // результаты в participantsObjectId = [user1]

{2} называть Parse.Object.saveAll (changedObjects) // результаты в participantsObjectId = [пользователь2] OVERRIDING membersObjectId = [user1]

Кроме того, комментарий о вашем коде: он становится более читаемым, если вы занимаете пробел. так что это не так плотно. Кроме того, я предлагаю на каждом «потом» вы комментируете, что это значит.

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