Какой смысл «возвращать» в обработчик afterSave в Parse - PullRequest
1 голос
/ 26 марта 2020

Я не совсем понимаю, какова цель ключевого слова return в обработчиках afterSave. Насколько я знаю, он не возвращает результат клиенту, и если да, то куда он возвращает результат? Pi c из документации Cloud Code приводятся ниже для справки.

enter image description here

1 Ответ

2 голосов
/ 27 марта 2020

В приведенном выше примере кода, который, я думаю, взят из документов, возвращение гарантирует, что любая ошибка из post.save() будет "поймана" catch.

В хуке afterSave ошибка никогда не будет возвращена клиенту. Возвращаемый объект не зависит от всего, что происходит в afterSave.

На что влияет возврат в afterSave, это когда соединение с клиентом будет закрыто.

Если вы вернете обещание, соединение не будет закрыто до разрешения обещания. В случае кода, который вы цитируете, обещание не возвращается, поэтому соединение будет немедленно закрыто, потому что функция afterSave вернется до разрешения обещания post.save ().

Для того, чтобы return, который вы выделили, чтобы иметь какое-либо влияние на клиента, вам также придется возвращать запрос следующим образом:

Parse.Cloud.afterSave('Comment', (request) => {
    const query = new Parse.Query('Post');
    return query.get(....)

В этом случае клиент будет ждать, пока подсчет комментариев поста не будет увеличивается и сохраняется до закрытия соединения.

Читайте дальше, чтобы понять, почему это важно, и другие тонкости, касающиеся afterSave и как работает «возврат»!

Вот некоторые соображения:

  1. Если вы собираетесь выполнять некоторые «дорогие» или длительные операции и клиенту не нужно ждать, убедитесь, что вы не возвращаете обещание и что функция afterSave не является async , Это было бы целесообразно, если вы хотите обновить внешнюю систему или отправить электронное письмо в результате сохранения. Вот пример того, как отключить ...
const afterSave = function afterSave(request) {
  const { object } = request;
  got.post('htttps://my.microservice/complete', { object })
    .then(() => console.log('done posting to microservice'))
    .catch(console.error);
};

Если при публикации микросервиса произошла ошибка, клиент никогда не узнает об этом, но он будет зарегистрирован на вашей консоли.

Случай, когда уместно заставить клиента ждать afterSave, - это случай, когда необходимо убедиться, что связанная операция завершена, прежде чем клиент вернет сохраненный объект обратно. Например, представьте, что вам нужно добавить нового пользователя в роль и что эту операцию необходимо завершить перед возвратом пользователя клиенту, иначе произойдет ошибка из-за отсутствия разрешений. В этом случае вам нужно сохранить пользователя, который присваивает ему идентификатор, прежде чем вы сможете добавить его в роль. Таким образом, в этом случае вы добавите пользователя к роли в afterSave, которая является асинхронной операцией c, и вернете полученное обещание, чтобы состояние разрешения пользователя было установлено и стало известно, когда клиент получит возвращенный объект пользователя.

Надеюсь, это поможет!

...