В приведенном выше примере кода, который, я думаю, взят из документов, возвращение гарантирует, что любая ошибка из 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
и как работает «возврат»!
Вот некоторые соображения:
- Если вы собираетесь выполнять некоторые «дорогие» или длительные операции и клиенту не нужно ждать, убедитесь, что вы не возвращаете обещание и что функция
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, и вернете полученное обещание, чтобы состояние разрешения пользователя было установлено и стало известно, когда клиент получит возвращенный объект пользователя.
Надеюсь, это поможет!