Я использую код облака разбора, чтобы обновлять некоторые счетчики для пользователя в beforeSave/afterDelete на определенных классах. У пользователя есть счетчик, который отслеживает количество своих подписчиков. Класс подписки - это класс отношений между пользователем и другим классом. Счет подписки пользователя обновляется в подписке beforeSave и afterDelete.Параметр обновления счетчика облачных вычислений в Before_Save
Parse.Cloud.beforeSave("Subscription", function(request, response) {
var fromUserPointer = subscription.get("fromUser");
fromUserPointer.fetch().then(function(user){
var subscriptionCount = user.get("subscriptionCount");
console.log(subscriptionCount + 1);
user.set("subscriptionCount", subscriptionCount + 1);
return user.save();
});
});
На клиентском приложении iPhone пользователь может перемещаться по таблицеView и быстро создавать объекты подписки. К сожалению, похоже, что вышеприведенный код не в состоянии идти в ногу. Похоже, что если подписки добавляются слишком быстро, строка var subscriptionCount = user.get("subscriptionCount");
вызывается до предыдущего before_save, которая сохраняет пользователя, и в итоге мы получаем устаревшее количество подписчиков.
Ниже приведен пример вывода консоли, которая демонстрирует это:
I2015-02-17T23:10:14.972Z] v268: before_save triggered for Subscription for user NHl80OFkKm
Input: {...}
Result: {...}
I2015-02-17T23:10:15.022Z] v268: before_save triggered for Subscription for user NHl80OFkKm
Input: {...}
Result: {...}
I2015-02-17T23:10:15.073Z] v268: before_save triggered for Subscription for user NHl80OFkKm
Input: {...}
Result: {...}
I2015-02-17T23:10:15.145Z] 1
I2015-02-17T23:10:15.224Z] v268: before_save triggered for _User for user NHl80OFkKm
Input: { ... "update":{"subscriptionCount":1}}
Result: Update changed to {"followersCount":0,"followingCount":0,"subscriptionCount":1}
I2015-02-17T23:10:15.244Z] 1
I2015-02-17T23:10:15.257Z] 1
I2015-02-17T23:10:15.276Z] v268: before_save triggered for _User for user NHl80OFkKm
Input: { ... "update":{"subscriptionCount":1}}
Result: Update changed to {"followingCount":0,"subscriptionCount":1,"followersCount":0}
I2015-02-17T23:10:15.329Z] v268: before_save triggered for _User for user NHl80OFkKm
Input: { ... "update":{"subscriptionCount":1}}
Result: Update changed to {"subscriptionCount":1,"followersCount":0,"followingCount":0}
I2015-02-17T23:10:15.576Z] v268: before_save triggered for Subscription for user NHl80OFkKm
Input: {...}
Result: {...}
I2015-02-17T23:10:15.611Z] v268: before_save triggered for Subscription for user NHl80OFkKm
Input: {...}
Result: ...
I2015-02-17T23:10:15.685Z] v268: before_save triggered for Subscription for user NHl80OFkKm
Input: {...}
Result: ...
I2015-02-17T23:10:15.692Z] 2
I2015-02-17T23:10:15.706Z] 2
I2015-02-17T23:10:15.715Z] v268: before_save triggered for _User for user NHl80OFkKm
Input: { ... "update":{"subscriptionCount":2}}
Result: Update changed to {"subscriptionCount":2,"followersCount":0,"followingCount":0}
I2015-02-17T23:10:15.732Z] v268: before_save triggered for _User for user NHl80OFkKm
Input: { ... "update":{"subscriptionCount":2}}
Result: Update changed to {"followersCount":0,"followingCount":0,"subscriptionCount":2}
I2015-02-17T23:10:15.789Z] 3
I2015-02-17T23:10:15.817Z] v268: before_save triggered for _User for user NHl80OFkKm
Input: { ... "update":{"subscriptionCount":3}}
Result: Update changed to {"followersCount":0,"followingCount":0,"subscriptionCount":3}
То же самое происходит и в afterDelete. Любая идея, как я могу обойти это? Единственным другим вариантом, который я могу придумать для этого, является прямой запрос в классе подписок, но это очень неэффективный подход.