2015-10-07 1 views
1

Я новичок в Parse Cloud Code .. однако я пытаюсь что-то теоретически должно быть прямолинейным, и я не могу понять, почему это не сработает!Почему код облачного секса для сохранения кода сохраняет один объект, но не другой?

в моем классе User я есть массив playableFriends, когда я создать объект игры Я желаю, чтобы удалить игрока и противника с каждого других playableFriends массива

Код для удаления соперника из игроков массива работает. но по какой-то причине неизвестный мне код для удаления игрока из массива противников не ... даже если это единственный исполняемый код.

У меня есть выход проигрыватель и противник объекты в консоль, чтобы гарантировать, что они существуют, и я также попытался с помощью команды выборки на сопернике, но это не сработало ни

Parse.Cloud.afterSave("Game",function(request, response){ 

    //return if existing game 
    if (request.object.existed()){ 
     return; 
    } 

    //get player 
    var player = request.object.get("playerIdle"); 
    //get opponent 
    var opponent = request.object.get("playerTurn"); 

    //remove opponent as playable friend 
    player.remove("playableFriends", opponent); 
    //remove player as opponents playable friend 
    opponent.remove("playableFriends", player); 

    player.save(); 
    opponent.save(); 
}); 

любой помощь будет в значительной степени оценили

приветы Byron

ответ

0

проблема заключается в том, что две операции сохранения в конце ваших функций являются асинхронными. В основном это означает, что когда достигнут ваш player.save();, выполнение продолжается до следующей строки, даже если операция сохранения может не завершиться (в вашем случае кажется, что это второе сохранение, которое не завершено). Есть несколько способов преодоления этого: обратные вызовы и обещания.

Обратный вызов - это блок кода, который передается в вашу функцию async, которая будет выполняться при завершении функции. С другой стороны, обещание позволяет вам получать уведомления о завершении работы функции асинхронизации. С помощью обещаний вы используете функцию then() для продолжения выполнения после выполнения первоначального обещания, которое может быть разрешено, если операция async была успешной или отклонено, если операция async вернула ошибку. Используя обещания, последние две строки вашей функции могут быть адаптированы следующим образом:

player.save().then(function(result){ 
    return opponent.save(); 
}, function (error){ 
    // We had an error saving the player 
}).then(function(result){ 
    console.log("Successfully saved user and opponent"); 
}, function(error){ 
    // We had an error saving the opponent 
}); 

Я предлагаю вам прочитать на обоих обратных вызовов и обещаниям, как асинхронные функции являются основной частью работы в среде Анализировать Облако кода. This blog post - отличное место для начала. Обратные вызовы могут быть понятны в краткосрочной перспективе, но могут привести к созданию кода, который сложнее понять и поддерживать по мере того, как ваше приложение будет усложняться.

EDIT

Поскольку списки управления доступом на противника пользователя ограничить операции записи только что пользователь, вам также необходимо использовать мастер-ключ, при сохранении, что объекты.

+0

Спасибо Тодду за потрясающий ответ! Я люблю Promises .. много читал и реализовал их, как вам было рекомендовано. Проблема все еще возникает, хотя теперь я смог вывести сообщение об ошибке из обещания (error.message) и оказалось, что он терпит неудачу, потому что сеанс/token требуется, чтобы изменить противника. UserCannotBeAlteredWithoutSessionError – Byron

+0

Похоже, вам нужно использовать мастер-ключ, чтобы обойти ACL на противнике. Попробуйте поставить 'Parse.Cloud.useMasterKey();' в верхней части вашей функции. – toddg

+0

Parse только позволяет изменять пользовательские объекты вошедшим в систему пользователем. Я смог использовать главный ключ, чтобы переопределить эту проверку. enemy.save (null, {useMasterKey: true}); – Byron

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