Я просматриваю весь код облака, который я написал для своего приложения, и я уже нашел что-то, что мне нужно исправить. У меня есть база данных синтаксического анализа, заполненная пользователями и «встречающимися» объектами. Каждый пользователь может создавать или просматривать и принимать собрания. Следующая функция вызывается, когда пользователь хочет принять встречу. Если необходимое количество людей равно числу лиц, принявших собрание, они будут подтверждены, иначе он останется доступным для других пользователей. Сегодня я попытался принять встречу одновременно от 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 });
});