2015-02-17 2 views
0

Я использую код облака разбора, чтобы обновлять некоторые счетчики для пользователя в 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. Любая идея, как я могу обойти это? Единственным другим вариантом, который я могу придумать для этого, является прямой запрос в классе подписок, но это очень неэффективный подход.

ответ

1

Я должен был ознакомиться с документацией еще немного. Этот прецедент зафиксирован здесь: https://parse.com/docs/js_guide#objects-updating.

Просто замените user.set("subscriptionCount", subscriptionCount + 1); с user.increment("subscriptionCount", 1);

Increment является атомарной операцией.

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